Подтвердить что ты не робот

Spring пример initBinder и webbindinginitializer

Я прочитал несколько книг по весне2,5 по этой теме, но до сих пор не могу понять, когда использовать @initBinder. может ли кто-нибудь поделиться ссылкой или объяснить, в какой ситуации я могу использовать это в веб-приложении? Как propertyEditor относится к нему?

4b9b3361

Ответ 1

Ну, я не могу сказать, что это лучше, чем книги, но если у вашего контроллера есть общедоступные методы, аннотированные с помощью @InitBinder, то эти методы будут вызываться контейнером непосредственно перед обработкой каждого запроса, передавая в WebDataBinder используется каркасом.

Наиболее распространенной причиной этого является необходимость настроить способ, с помощью которого Spring пытается связать параметры запроса с вашей моделью, например, если ваша модель имеет пользовательские типы данных, которые Spring не может справиться с коробка. Вы регистрируете PropertyEditors против WebDataBinder. Тривиальный пример может быть, если вы используете библиотеку JodaTime в своей модели и хотите привязать строки timestamp к объекту Joda DateTime.

С Spring 2.0 вы должны переопределить защищенный метод initBinder() из суперкласса контроллера, но Spring 2.5 удаляет необходимость этого, теперь вы можете просто использовать аннотации.

Ответ 2

Другая причина, о которой говорил скаффман, - установить пользовательский валидатор в вашем WebDataBinder. Обычно я использую проверку JSR-303 bean, а затем свяжу валидатор, который обеспечивает дополнительную проверку, не предоставленную JSR-303.

Внутри вашего контроллера:

@InitBinder
protected void initBinder(WebDataBinder webDataBinder) {
    Validator validator = webDataBinder.getValidator();
    webDataBinder.setValidator(new UserFormValidator(validator));
}

То, что я делаю, принимает валидатор bean, вызывая его внутри моего настраиваемого валидатора, а затем вызывает мои пользовательские проверки. Что-то вроде этого:

public class UserFormValidator implements Validator {

    private Validator validator;

    public AuthUserFormValidator(Validator validator) {
        this.validator = validator;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return UserForm.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        // Run the bean validation...

        validator.validate(target, errors);

        // Do your custom validation on userForm here...

        UserForm userForm = (UserForm) target;

        // Validation on userForm...
    }
}