我在spring2.5上读过关于这些主题的几本书,但是仍然无法抓住使用@initBinder时的概念。任何人都可以分享任何参考或解释在什么情况下我可以在Web应用程序上使用它? propertyEditor如何与它相关?
答案 0 :(得分:14)
嗯我真的不能比书本更好,但如果您的控制器有任何使用@InitBinder注释的公共方法,那么这些方法将在每个请求处理之前由容器调用,传入WebDataBinder正在被框架使用。
执行此操作的最常见原因是,您希望自定义Spring尝试将请求参数绑定到模型的方式,例如,如果您的模型具有Spring无法处理的自定义数据类型。您对WebDataBinder注册PropertyEditors。如果您在模型中使用JodaTime库,并且想要将时间戳字符串绑定到Joda DateTime对象,那么这将是一个简单的示例。
使用Spring 2.0,您必须从控制器超类中覆盖受保护的initBinder()方法,但Spring 2.5无需执行此操作,您现在可以立即使用注释。
答案 1 :(得分:7)
skaffman提到的另一个原因是在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...
}
}
答案 2 :(得分:1)
它需要Spring 2.5.1+ 见https://jira.springsource.org/browse/SPR-4182