Thymeleaf 注册页面 - 执行处理器“org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor”时出错
Posted
技术标签:
【中文标题】Thymeleaf 注册页面 - 执行处理器“org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor”时出错【英文标题】:Thymeleaf registration page - Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' 【发布时间】:2016-07-04 11:52:38 【问题描述】:我正在制作一个网站的注册页面。我知道为了创建新用户,需要一个 id,所以我们有以下字段:
<input type="hidden" th:field="*id />
但是,当我转到该页面时,我收到了我在这篇文章标题中提到的错误。
这里是有问题的表格:
<form th:action="@/users/register" th:object="$user" class="form-signin" method="POST">
<h2 class="form-signin-heading">Register</h2>
<input type="hidden" th:field="*id" />
<label for="inputUsername" class="sr-only">Username*</label>
<input type="text" th:field="*username" name="username" id="inputUsername" class="form-control" placeholder="Username" required="required" autofocus="autofocus" />
<label for="inputEmail" class="sr-only">Email Address*</label>
<input type="text" th:field="*email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required="required" autofocus="autofocus" />
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" th:field="*password" name="password" id="inputPassword" class="form-control" placeholder="Password" required="required" />
<label for="inputConfirmPassword" class="sr-only">Confirm Password</label>
<input type="password" th:field="$confirmPassword" name="confirmPassword" id="inputConfirmPassword" class="form-control" placeholder="Confirm password" required="required" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>
</form>
这是我的用户控制器:
@RequestMapping("/register")
public String registerAction(Model model)
model.addAttribute("user", new User());
model.addAttribute("confirmPassword", "");
return "views/users/register";
@RequestMapping(value="/register", method = RequestMethod.POST)
public String doRegister(User user)
User savedUser = userService.save(user);
return "redirect:/"; //redirect to homepage
以及用户实体的第一部分:
@Entity
@Table(name = "users")
public class User
// Default constructor require by JPA
public User()
@Column(name = "id")
@Id @GeneratedValue
private Long id;
public void setId(long id)
this.id = id;
public long getId()
return id;
据我所知,这里没有任何问题,所以我被卡住了。
我正在关注这个例子:https://github.com/cfaddict/spring-boot-intro
有什么想法吗?
【问题讨论】:
【参考方案1】:问题在于您声明 id 属性的方式。该字段使用为空的引用类型 Long。 getter 使用原始 long。当 Spring 访问 id 字段时,它会尝试将导致错误的空值拆箱。将您的域类更改为
@Entity
@Table(name = "users")
public class User
// Default constructor required by JPA
public User()
@Id
@Column(name = "id")
@GeneratedValue
private Long id;
public void setId(Long id)
this.id = id;
public Long getId()
return id;
【讨论】:
【参考方案2】:不知道你们有没有这样的课
@Controller
@RequestMapping("/users")
public class MyController
@RequestMapping("/register")
public String registerAction(Model model)
model.addAttribute("user", new User());
model.addAttribute("confirmPassword", "");
return "views/users/register";
@RequestMapping(value="/register", method = RequestMethod.POST)
public String doRegister(User user)
User savedUser = userService.save(user);
return "redirect:/"; //redirect to homepage
因为如果你没有@RequestMapping("/users")
,这是一个问题,因为如果你在课堂上没有这个注释,那么百里香模板中的正确操作应该是“@/register”,否则不要换句话说,使用您发布的方法发布端点,您应该有一个这样的模板:
<form th:action="@/register" th:object="$user" class="form-signin" method="POST">
<h2 class="form-signin-heading">Register</h2>
<input type="hidden" th:field="*id" />
.... should be as you written
<input type="password" th:field="*confirmPassword" id="inputConfirmPassword" class="form-control" placeholder="Confirm password" required="required" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>
</form>
更好地阅读您的 html,您可能应该拥有 th:field="*confirmPassword" 而不是 th:field="$confirmPassword"。 另一个认为在我看来不起作用的是您重复名称属性。我的建议是不要重复,让 thymeleaf 为数据绑定构建正确属性的工作。
【讨论】:
我刚刚尝试了该更改,但没有任何区别 - 我确定这与 id 字段有关,因为取出隐藏字段可以查看注册表单至少。 我可以建议看看这个指南spring.io/guides/gs/handling-form-submission 我在开源项目github.com/mrFlick72/socialDocumentLibrary/blob/master/… 中使用百里香。在此链接中,您可以看到我是如何像您一样完成文件上传的以上是关于Thymeleaf 注册页面 - 执行处理器“org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor”时出错的主要内容,如果未能解决你的问题,请参考以下文章
在同一个html页面中处理thymeleaf两种形式给出错误
如何将 Thymeleaf 对象从基本页面传递到 ajax 生成页面?