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 生成页面?

Thymeleaf实现页面静态化

thymeleaf模板,页面之间跳转的问题?

SpringBoot + Thymeleaf + SQL,显示来自数据库的 HTML 表格

jquery 事件,注册 与重复事件处理