Spring + Thymeleaf 绑定表单 NullpointerException

Posted

技术标签:

【中文标题】Spring + Thymeleaf 绑定表单 NullpointerException【英文标题】:Spring + Thymeleaf binding form NullpointerException 【发布时间】:2015-02-01 03:15:53 【问题描述】:

我目前正在处理用户编辑表单。

我有一个具有以下结构的用户对象(伪代码):

User

String name,
int age,
Address adress,
Email email,
User child,

getter/setter

现在,我将这个对象作为对象放入 Model 中,如下所示:

@RequestMapping(value = "/login/edit", method = RequestMethod.GET)
public ModelAndView editUserByLogin(@PathVariable("login") final String login) 
    final User currentUser = UserRepository.findPersonByLogin(login);

    ModelAndView mav = new ModelAndView(URL_EDIT_USER);
    mav.addObject(MODEL_USER, currentUser);

    return mav;

在我的模板(我使用百里香)中,我像这样绑定这些对象:

<form class="form-horizontal" method="post" >
<div class="form-group">
    <label class="col-sm-2 control-label" th:text="#user.name">name</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" th:field="*user.name" />
    </div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label" th:text="#user.address.street">name</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" th:field="*user.address.street" />
    </div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label" th:text="#user.child.email.value">name</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" th:field="*user.child.email.value" />
    </div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label" th:text="#user.child.address.street">name</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" th:field="*user.child.address.street" />
    </div>
</div>
</form>

在 GET 方法中,模板/html 显示了我期望的正确数据。现在我编辑字段并提交表单,然后我收到以下错误:

java.lang.NullPointerException: null
    at com.example.user.model.Email.hashCode(EMail.java:66) ~[classes/:na]
    at java.lang.Object.toString(Unknown Source) ~[na:1.8.0_25]
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25]
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25]
    at org.springframework.validation.FieldError.toString(FieldError.java:102) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25]
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25]
    at org.springframework.validation.AbstractErrors.toString(AbstractErrors.java:243) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
    at org.springframework.validation.BindException.getMessage(BindException.java:284) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
    at java.lang.Throwable.getLocalizedMessage(Unknown Source) ~[na:1.8.0_25]
    at java.lang.Throwable.toString(Unknown Source) ~[na:1.8.0_25]
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25]
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25]

所有字段都正确传输,除非子对象的电子邮件字段。

我不知道为什么会发生错误,结构是一样的,数据是有效的,有趣的是当我在一个单独的对象中抓取子电子邮件元素时,它发生了

有人有想法吗?

提前致谢。

编辑: 电子邮件类:

@Entity(name="Email")
public class Email implements Serializable

    private static final long serialVersionUID = 6891079722082340011L;

    @Id()
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Expose
    protected Long eMailId;
    @Expose
    protected String value;

    //getter/setter

    @Override
    public boolean equals(Object obj)
    
        if(obj instanceof EMail)
            return value.equals(((Email) obj).getValue());
        
        return false;
    

    @Override
    public int hashCode()
    
        return value.hashCode();
    

发帖方式:

@RequestMapping(value = "/login/edit", method = RequestMethod.POST)
public ModelAndView updateUser(@PathVariable("login") final String login, @ModelAttribute final User webUser) 
    final Person repoUser = personRepository.findPersonByLogin(login);
    repoUser.updateWith(webUser);

    return new ModelAndView("redirect:" + URL_USERS_OVERVIEW);

【问题讨论】:

发布 com.example.user.model.Email 和 EMail.java 对不起,这是我的错。我已经更正了代码词汇的拼写。电子邮件类与电子邮件相同。我有我工作的代码。我认为这取决于休眠的注释。我用于控制器的类与我用于数据库(实体)的类相同。明天我会更新代码。 你也可以添加post处理方法吗,因为你只有get处理方法 我已经更新了代码,检查一下 【参考方案1】:

NullPointerException 发生在您的 Email.hashCode() 方法中。如果value 为空,则查看您的代码可能会发生这种情况。

您发布的模板不包含user.email.value 字段,因此这很可能是它为空的原因。

您需要为用户电子邮件添加一个字段,或者更改hashCode 方法以便它处理空值。

【讨论】:

谢谢。不知何故,我有一个 hashCode 方法,可能是自动生成的,在我的实体代码中被覆盖。

以上是关于Spring + Thymeleaf 绑定表单 NullpointerException的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot Thymeleaf 绑定枚举在隐藏字段

Thymeleaf 地图表单绑定

Thymeleaf/Spring - 将项目从组合框添加到表中

datetimepicker 值未绑定到带有 thymeleaf 的属性 spring

Thymeleaf + Spring MVC中的绑定复选框

如何添加到 Thymeleaf/Spring Boot 发布请求中的子对象列表