在多个类的spring MVC控制器中应用自定义validation器

我有一个使用自定义valiadtor的注册页面

public class CustomValidator implements Validator { private Validator validator; public CustomValidator(Validator validator) { this.validator = validator; } @SuppressWarnings("rawtypes") public boolean supports(Class clazz) { return Registration.class.equals(clazz); } public void validate(Object target, Errors errors) { validator.validate(target, errors); Registration myModel1 = (Registration) target; if (! myModel1.getConfirm_password().equals(myModel1.getPassword())) { errors.rejectValue("confirm_password", "confirm_password.confirm"); } } } 

问题是我想将它应用于两个表单,所以我很困惑如何用两个类编写这个函数。 此function现在只有注册类。 如果我也想要其中的Person类怎么办?

 public boolean supports(Class clazz) { return Registration.class.equals(clazz); } 

我可以在该函数中编写多个类吗?

这是我的控制器

 @InitBinder public void initBinder(final WebDataBinder binder) { binder.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("dd-MM-yyyy"), true)); Validator validator = (Validator) binder.getValidator(); binder.setValidator(new CustomValidator((org.springframework.validation.Validator) validator)); } 

你可以做到这一点

 public boolean supports(Class clazz) { return Registration.class.equals(clazz) || Another.class.equals(clazz); } 

然后你的validation应该做这样的事情

  public void validate(Object target, Errors errors) { validator.validate(target, errors); String password = null; String confirm = null; if (target instanceof Registration) { Registration registration = (Registration) target; password = registration.getPassword(); confirm = registration.getConfirm_password(); } else if (target instanceof Another) { Another another = (Another) target; password = another.getPassword(); confirm = another.getConfirm_password(); } if (! confirm.equals(password())) { errors.rejectValue("confirm_password", "confirm_password.confirm"); } } 

我不认为你应该使用它可能最好用于分离类更好的可读性,并降低复杂性。 在validation器中引入层次结构或模型对象(Vistor模式)不是最佳解决方案。

您似乎只想validation2个类,因为您希望复制“确认密码”validation,其中您有2个应匹配的密码字段。 相反,为什么不简单地将接口传递给validation器?

 public void validate(IPasswordContainer target, Errors errors) { if(!target.getConfirm_password().equals(target.getPassword())) { errors.rejectValue("confirm_password", "confirm_password.confirm"); } } public boolean supports(Class clazz) { return IPasswordContainer.class.equals(clazz); }