Validation 使用Spring@Valid注释验证部分模态
我有一个用户模型Validation 使用Spring@Valid注释验证部分模态,validation,spring-mvc,Validation,Spring Mvc,我有一个用户模型 public class RegisterUser { @Size(min = 2, max = 30) private String fname; @Size(min = 2, max = 30) private String lname; @NotEmpty @Size(min = 6, max = 15) private String password; .... @NotEmpty
public class RegisterUser {
@Size(min = 2, max = 30)
private String fname;
@Size(min = 2, max = 30)
private String lname;
@NotEmpty
@Size(min = 6, max = 15)
private String password;
....
@NotEmpty
private String publicProfile;
... getters and setters
}
1) 我想在注册操作期间使用此模式(fname、lname、password等,但不带publicProfile字段)
2) 我想在myprofile操作期间使用此模式(除密码外的所有字段)
我的注册行动:
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String submitRegisterForm(
@Valid RegisterUser registerUser,
BindingResult result,
Model m) {
....
}
这里我不打算在jsp上提供“publicprofile”,因此不想验证这个字段,尽管我的模式有@NotEmpty注释
我对myprofile的操作
@RequestMapping(value = "/myprofile", method = RequestMethod.POST)
public String submitMyprofileForm(
@Valid RegisterUser registerUser,
BindingResult result,
Model m) {
....
}
在这里,我不打算在jsp上提供“password”字段,因此不想验证这个字段,尽管我的model有@NotEmpty和@Size(min=6,max=15)注释
我的问题是我如何才能做到这一点?
是否有任何方式,我可以说,在这个模式下,这个行动验证只提到的领域
提前谢谢
Manisha我不知道这是否可以通过Bean验证实现,但是您可以为不同的请求参数设置不同的实现
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String submitRegisterForm(@Valid RegisterUser registerUser, ...
及
然后,您可以使用@InitBinder
将不同的验证器连接到您的请求参数。您可以将这些方法添加到控制器中。只需在第二个验证器中省略您不需要的验证
@InitBinder("registerUser")
protected void initUserBinder(WebDataBinder binder) {
binder.setValidator(new RegisterUserValidator());
}
@InitBinder("registerUserProfile")
protected void initUserBinderProfile(WebDataBinder binder) {
binder.setValidator(new RegisterUserProfileValidator());
}
然后您需要手动执行注释。您还可以对验证器使用继承,因为它们完全相同,除了注册表单的一个附加字段验证
public class RegisterUserValidator implements Validator {
public boolean supports(Class clazz) {
return RegisterUser.class.equals(clazz);
}
public void validate(Object obj, Errors e) {
ValidationUtils.rejectIfEmpty(e, "publicProfile", "empty");
RegisterUser r = (RegisterUser) obj;
if (r.getFname().length() < 2) {
e.rejectValue("fname", "min");
} else if (r.getFname().length() > 30) {
e.rejectValue("fname", "max");
}
// ...
}
}
公共类RegisterUserValidator实现验证器{
公共布尔支持(类clazz){
返回RegisterUser.class.equals(clazz);
}
公共无效验证(对象obj,错误e){
ValidationUtils.rejectIfEmpty(e,“publicProfile”、“empty”);
RegisterUser r=(RegisterUser)obj;
if(r.getFname().length()<2){
e、 拒绝价值(“fname”、“min”);
}else if(r.getFname().length()>30){
e、 拒绝价值(“fname”、“max”);
}
// ...
}
}
您可以使用(针对不同的场景)和Spring注释来指定要使用的组非常感谢。。这正是我想要的。我也接受了你的回答。
public class RegisterUserValidator implements Validator {
public boolean supports(Class clazz) {
return RegisterUser.class.equals(clazz);
}
public void validate(Object obj, Errors e) {
ValidationUtils.rejectIfEmpty(e, "publicProfile", "empty");
RegisterUser r = (RegisterUser) obj;
if (r.getFname().length() < 2) {
e.rejectValue("fname", "min");
} else if (r.getFname().length() > 30) {
e.rejectValue("fname", "max");
}
// ...
}
}