применять собственный валидатор в контроллере MVC Spring в нескольких классах - PullRequest
2 голосов
/ 11 марта 2011

У меня есть одна страница регистрации, которая использует собственный валидатор

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 ]

5 голосов
/ 11 марта 2011

Вы могли бы сделать это

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) - не лучшее решение.

0 голосов
/ 13 августа 2018

Похоже, вы хотите проверить только 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...