Spring:相同的对象,不同的验证

Jav*_*avi 6 validation spring

我有一个名为User的对象,我保存用户的所有数据.我有一些注释来执行验证,它工作正常.

public class User{
    @NotEmpty
    @Email
    @Size(max=100)
    @Column(name="username", length=100, nullable=false, unique=true)
    private String username;

    @NotEmpty
    @Size(min=5, max=40)
    @Column(name="password", length=40, nullable=false)
    private String password;

    @Size(min=5, max=40)
    @Transient
    private String newPassword;

    // other attributes ,getters and setters
 }
Run Code Online (Sandbox Code Playgroud)

我有两种不同的形式(每种形式在不同的页面中).在第一个我要求用户名和密码来创建用户,所以这两个都是强制性的.

在第二种形式中,我显示了有关用户的信息:用户名,其他数据(也将进行验证)以及密码和newPassword.如果设置了newPassword并且密码与用户的密码相同,我将更改用户的密码,但如果它们保留为空,则表示我不应更改密码.

问题是我有两个与同一个对象相关的表单,其中对字段密码进行了不同的验证.在第一个中它必须不是空的,但在第二个中它可以是空的.

在控制器中,我以这种方式验证对象:

public String getUserDetails(@Valid @ModelAttribute("User") User user, BindingResult result, Model model){
    if(result.hasErrors()){
        //There have been errors
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是密码是空的,会有错误.

有没有办法只在对象的某些字段中执行验证?

我至少可以在验证后删除任何验证错误吗?

在这种情况下,最佳做法是什么?

谢谢

ber*_*nie 7

您可以使用JSR-303约束组来实现此目的。

public class User {

    public interface GroupNewUser {};

    @NotEmpty
    private String username;

    @NotEmpty(groups = {GroupNewUser.class});
    private String password;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中,而不是使用@Valid,使用Spring的@Validated注释,该注释允许指定要应用的约束组。

有关更多信息,请参见此博客文章以及文章

Spring的使用中也有这个很棒的帖子


ska*_*man 4

这是声明式验证的问题,做这种事情并不容易。

最简单的解决方案是从密码字段中删除验证注释,并在控制器中手动验证该字段。该类BindingResult具有用于显式将字段标记为无效的方法。

另一种选择是创建表单类的两个子类,每个子类都有自己的密码字段,一个带有验证注释,一个没有,并在适当的位置使用适当的子类。

  • 有一个使用 JSR-303 约束组的解决方案(现在?)。http://stackoverflow.com/a/36345405/1030527 (3认同)