我读了几本关于这些主题的 spring2.5 书籍,但仍然无法掌握何时使用 @initBinder 的概念。任何人都可以分享任何参考或解释在什么情况下我可以在网络应用程序上使用它?propertyEditor 与它有什么关系?
3 回答
好吧,我真的不能说它比书籍更好,但是如果您的控制器有任何使用 @InitBinder 注释的公共方法,那么这些方法将在处理每个请求之前由容器调用,并传入正在使用的 WebDataBinder框架。
这样做的最常见原因是当您想要自定义 Spring 尝试将请求参数绑定到模型的方式时,例如,如果您的模型具有 Spring 无法开箱即用的自定义数据类型。您针对 WebDataBinder 注册您的 PropertyEditor。一个简单的例子是,如果您在模型中使用 JodaTime 库,并且您希望将时间戳字符串绑定到 Joda DateTime 对象。
在 Spring 2.0 中,您过去必须从控制器超类中覆盖受保护的 initBinder() 方法,但 Spring 2.5 消除了这样做的需要,您现在可以使用注释。
除了 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...
}
}
它需要 Spring 2.5.1+ 参见https://jira.springsource.org/browse/SPR-4182