spring initBinder 和 webbindinginitializer 示例

2022-09-04 08:40:09

关于这些主题的spring2.5,我读的书很少,但仍然无法抓住何时使用@initBinder的概念。任何人都可以分享任何参考或解释在什么情况下我可以在Web应用程序上使用它?propertyEditor如何与它相关?


答案 1

好吧,我真的不能比书本上更好,但是如果你的控制器有任何用@InitBinder注释的公共方法,那么这些方法将在处理每个请求之前由容器调用,并在框架使用的WebDataBinder中传递。

执行此操作的最常见原因是当您想要自定义Spring尝试将请求参数绑定到模型的方式时,例如,如果您的模型具有Spring无法开箱即用处理的自定义数据类型。您针对 WebDataBinder 注册您的 PropertyEditors。一个简单的例子是,如果您在模型中使用 JodaTime 库,并且想要将时间戳字符串绑定到 Joda DateTime 对象。

在Spring 2.0中,您过去必须从控制器超类中覆盖受保护的initBinder()方法,但是Spring 2.5消除了这样做的需要,您现在只需使用注释即可。


答案 2

除了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...
    }
}

推荐