Spring initBinder и пример webbindinginitializer - PullRequest
12 голосов
/ 14 июня 2009

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

Ответы [ 3 ]

14 голосов
/ 17 июня 2009

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

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

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

7 голосов
/ 05 июня 2011

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

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

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

Что я делаю, так это беру в себя валидатор бина, вызываю его внутри моего пользовательского валидатора, а затем вызываю мои пользовательские валидации. Как то так:

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...
    }
}
1 голос
/ 05 января 2010

Требуется Spring 2.5.1+ см https://jira.springsource.org/browse/SPR-4182

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...