我当前正在发送登录的User对象以查看该对象,该对象将通过th:object注入到表单中。我想更新此User对象中的某些属性,但仍保留该对象的其余内容。但是,当我提交此表单时,User对象包含除我在百里香页中设置的值以外的所有值的空值。我知道一种解决方案是为我想保留的值添加隐藏的标签,但是如果User对象很大,这似乎非常乏味。

@RequestMapping(value="/newprofile", method=RequestMethod.GET)
public String newProfile(Model model, Principal principal) {
    String email = principal.getName();
    User user = userService.findUserByEmail(email);
    model.addAttribute("user", user);
    return "newprofile";
}

@RequestMapping(value="/newprofile", method=RequestMethod.POST)
public String registerNewProfile(Model model,User user, Principal principal) {
    userService.saveProfile(user); //this user object will contain null values
    return "redirect:/profile";
}


这是表格的外观。传入的用户对象是现有的User,其值已设置。有成员变量可以更新。

<form autocomplete="off" action="#" th:action="@{/newprofile}" th:object="${user}" method="post" class="form-signin" role="form">
    <h3 class="form-signin-heading">Registration Form</h3>
    <div class="form-group">
        <div class="">
            <input type="text" th:field="*{profile.basicInfo.age}" placeholder="Name" class="form-control" />
        </div>
    </div>
    <div class="form-group">
        <div class="">
            <button type="submit" class="btn btn-primary btn-block">Update profile</button>
        </div>
    </div>
</form>


提交表单后,我将通过Spring JPA的save()方法执行该User对象的保存。但是,如果User对象包含null,则将错误地将这些值“更新”为null。同样,我可以做一些检查来验证哪些成员应该更新,哪些不应该更新,但这似乎是不正确的...

@Override
public User saveProfile(User user) {
    // TODO Auto-generated method stub
    userRepository.save(user);
    return user;
}

最佳答案

我们可以在模型类属性上使用bean validation API批注,如下所示:

@NotNull(message = "Name cannot not be null")
private String name;


@NotEmpty@NotBlank的类似用法

这样,如果任何验证失败,它将不会输入。

09-11 19:58
查看更多