spring initBinder和webbindinginitializer示例

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)