Spring MVC验证器注释+自定义验证
我正在研究Spring MVC应用程序,我应该在此基于Spring
MVC验证器进行验证。我的第一步是为类和安装程序控制器添加了注释,并且工作正常。现在,我需要实现自定义验证器以执行复杂的逻辑,但是我想使用现有的批注并仅添加其他检查。
我的用户类别:
public class User{
@NotEmpty
private String name;
@NotEmpty
private String login; // should be unique
}
我的验证人:
@Componentpublic class UserValidator implements Validator
{
@Autowired
private UserDAO userDAO;
@Override
public boolean supports(Class<?> clazz)
{
return User.class.equals(clazz) || UsersForm.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors)
{
/*
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotEmpty.user");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "NotEmpty.user");
*/
User user = (User) target;
if (userDAO.getUserByLogin(user.getLogin()) != null) {
errors.rejectValue("login", "NonUniq.user");
}
}
}
我的控制器:
@Controllerpublic class UserController
{
@Autowired
private UserValidator validator;
@InitBinder
protected void initBinder(final WebDataBinder binder)
{
binder.setValidator(validator);
}
@RequestMapping(value = "/save")
public ModelAndView save(@Valid @ModelAttribute("user") final User user,
BindingResult result) throws Exception
{
if (result.hasErrors())
{
// handle error
} else
{
//save user
}
}
}
因此,可以同时使用自定义验证程序和注释吗?如果是的话,怎么办?
回答:
我知道这是一个古老的问题,但对于Google员工来说…
您应该使用addValidators
而不是setValidator
。如下所示:
@InitBinderprotected void initBinder(final WebDataBinder binder) {
binder.addValidators(yourCustomValidator, anotherValidatorOfYours);
}
PS:addValidators
接受多个参数(省略号)
如果您org.springframework.validation.DataBinder
查看来源,您将看到:
public class DataBinder implements PropertyEditorRegistry, TypeConverter { ....
public void setValidator(Validator validator) {
assertValidators(validator);
this.validators.clear();
this.validators.add(validator);
}
public void addValidators(Validator... validators) {
assertValidators(validators);
this.validators.addAll(Arrays.asList(validators));
}
....
}
如您所见,setValidator
清除了现有的(默认)验证器,因此@Valid
注释无法按预期工作。
以上是 Spring MVC验证器注释+自定义验证 的全部内容, 来源链接: utcz.com/qa/411274.html