Я прочитал несколько книг по весне2,5 по этой теме, но до сих пор не могу понять, когда использовать @initBinder. может ли кто-нибудь поделиться ссылкой или объяснить, в какой ситуации я могу использовать это в веб-приложении? Как propertyEditor относится к нему?
Spring пример initBinder и webbindinginitializer
Ответ 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...
}
}
Ответ 3
Для этого требуется Spring 2.5.1+ см. https://jira.springsource.org/browse/SPR-4182