我有一个名为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)
但是密码是空的,会有错误.
有没有办法只在对象的某些字段中执行验证?
我至少可以在验证后删除任何验证错误吗?
在这种情况下,最佳做法是什么?
谢谢
您可以使用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的使用中也有这个很棒的帖子。
这是声明式验证的问题,做这种事情并不容易。
最简单的解决方案是从密码字段中删除验证注释,并在控制器中手动验证该字段。该类BindingResult具有用于显式将字段标记为无效的方法。
另一种选择是创建表单类的两个子类,每个子类都有自己的密码字段,一个带有验证注释,一个没有,并在适当的位置使用适当的子类。