我正在研究Spring MVC应用程序,我应该在此基于Spring MVC验证器进行验证。我的第一步是为类和安装程序控制器添加了注释,并且工作正常。现在,我需要实现自定义验证器以执行复杂的逻辑,但是我想使用现有的批注并仅添加其他检查。
我的用户类别:
public class User { @NotEmpty private String name; @NotEmpty private String login; // should be unique }
我的验证人:
@Component public 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"); } } }
我的控制器:
@Controller public 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。如下所示:
addValidators
setValidator
@InitBinder protected void initBinder(final WebDataBinder binder) { binder.addValidators(yourCustomValidator, anotherValidatorOfYours); }
PS:addValidators接受多个参数(省略号)
如果您org.springframework.validation.DataBinder查看来源,您将看到:
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注释无法按预期工作。
@Valid