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

时间:2011-03-11 13:15:04

标签: java validation spring-mvc

我有一个使用自定义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");
        }

    }
}

问题是我想在两个表单上应用它,所以我很困惑如何用两个类编写这个函数。此功能现在只有注册类。如果我也想在其中使用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));
    }

2 个答案:

答案 0 :(得分:5)

你可以这样做

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

然后你的验证应该做这样的事情

    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");
    }

}

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

答案 1 :(得分:0)

您似乎只想验证2个类,因为您想重复“确认密码”验证,因为您有2个应该匹配的密码字段。相反,为什么不简单地将接口传递给验证器呢?

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);
}