com*_*tta 12 java spring spring-mvc
关于这些主题,我在spring2.5上读了几本书,但是仍然无法抓住使用@initBinder时的概念.任何人都可以分享任何参考或解释在什么情况下我可以在Web应用程序上使用它?propertyEditor如何与它相关?
ska*_*man 14
好吧,我不能把它比书本更好,但是如果你的控制器有任何使用@InitBinder注释的公共方法,那么这些方法将在每个请求被处理之前被容器调用,传入正在使用的WebDataBinder框架.
执行此操作的最常见原因是,您希望自定义Spring尝试将请求参数绑定到模型的方式,例如,如果您的模型具有Spring无法处理的自定义数据类型.您对WebDataBinder注册PropertyEditors.如果您在模型中使用JodaTime库,并且希望将时间戳字符串绑定到Joda DateTime对象,那么这将是一个简单的示例.
使用Spring 2.0,您必须从控制器超类中覆盖受保护的initBinder()方法,但Spring 2.5无需执行此操作,您现在只需使用注释即可.
小智 7
除了skaffman提到的另一个原因是在WebDataBinder上设置自定义验证器.我通常会做的是使用JSR-303 bean验证,然后绑定一个验证器,它提供JSR-303未提供的额外验证.
在您的控制器内:
@InitBinder
protected void initBinder(WebDataBinder webDataBinder) {
Validator validator = webDataBinder.getValidator();
webDataBinder.setValidator(new UserFormValidator(validator));
}
Run Code Online (Sandbox Code Playgroud)
我正在做的是接受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...
}
}
Run Code Online (Sandbox Code Playgroud)