Java Spring:如何仅验证实体中的特定字段

时间:2014-09-08 16:01:44

标签: java spring forms hibernate validation

我是Spring的新手,我在表单验证方面遇到了问题。在我的用户编辑表单中,我想仅验证特定字段,而不是在我的实体中注释的所有字段。 例如,如果我的UserEntity包含字段:

@Entity
@Table(name = "users")
public class UserEntity {

@Id
@Column(name = "user_id")
@GeneratedValue
public int user_id;

@NotEmpty
@Column(name = "userlogin")
public String userlogin;

@NotEmpty
@Column(name = "userpass")
public String userpass;

@NotEmpty
@Column(name = "name")
public String name;

@Email
@NotEmpty
@Column(name = "email")
public String email;

@NumberFormat(style = Style.NUMBER)
@NotEmpty
@Column(name = "phone")
public String phone;

当我注册表单时,我需要验证所有字段,并且工作正常。 但是当我编辑用户表单时,我只想编辑和验证'name','email'和'phone',我不想更改'userlogin'和'userpass'。 但是编辑表单不会成功通过,因为BindingResult验证所有字段。 这是我的编辑表格:

 <springForm:form action="/mywebapp/user/edit" commandName="user" method="POST">
    <table>     
        <tr>
            <td>Name:</td>
            <td><springForm:input path="name" value="${user.name}" /></td>
            <td><springForm:errors path="name" cssClass="error" /></td>
        </tr>
        <tr>
            <td>E-mail:</td>
            <td><springForm:input path="email" value="${user.email }" /></td>
            <td><springForm:errors path="email" cssClass="error" /></td>
        </tr>
        <tr>
            <td>Phone:</td>
            <td><springForm:input path="phone" value="${user.phone}" /></td>
            <td><springForm:errors path="phone" cssClass="error" /></td>

        </tr>
        <tr>
            <td><input type="submit" value="Edit" /></td>
        </tr>
    </table>
</springForm:form>

这是我的控制器方法:

 @RequestMapping(value="user/edit", method=RequestMethod.POST)
 public String doUserEdit(@Valid @ModelAttribute("user") UserEntity user, BindingResult result, Principal principal) {

    if(result.hasErrors()) {
        return "user/edit";
    }
    UserEntity u = this.userService.getUser(principal.getName());


    this.userService.editUser(u.getUser_id(), user);

    return "redirect:/user";
}

result.hasError()始终返回true,因为它还验证了'userlogin'和'userpass'。

如何忽略编辑表单中的其他字段并仅验证我想要的字段?

1 个答案:

答案 0 :(得分:1)

我通常创建一个单独的表单类,它只适用于表单提交处理并在那里进行所有必要的验证:

public class UserUpdateForm {
    @NotEmpty
    private String name;
    @Email
    private String email;
    @NotEmpty
    @NumberFormat(style = Style.NUMBER)
    private String phone;

    //Getters and setters here
} 

这个想法是你从表示(表单)类解开你的模型类。唯一的缺点是你必须以某种方式处理表单对象和模型对象之间的转换。像dozer这样的东西可能会有所帮助。