3.13、@InitBinder 和 WebDataBinder

  这一部分示例见这个项目的 mvc 分支下的 WebDataBinderController.java

① 用@InitBinder自定义数据绑定

  用@InitBinder注解的控制器方法,允许你直接在你的控制器类中配置 Web 数据绑定。@InitBinder标记初始化WebDataBinder的方法,WebDataBinder被用于填充被注解的处理方法的命令和表单对象参数。

  这些初始化绑定器(Init-binder)方法支持@RequestMapping方法支持的所有参数,处理命令/表单对象以及相关的校验结果对象。初始化绑定器方法必须不带返回值,所以它们通常被声明为 void 的。典型的参数包括WebDataBinderWebRequest或者java.util.Locale,允许用代码方式注册特定上下文的编辑器(context-specific editors)。

  下面的例子演示了使用@InitBinder为所有的java.util.Date表单属性配置一个CustomDateEditor

@Controller
public class MyFormController 
{
    @InitBinder
    protected void initBinder(WebDataBinder binder) 
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

    // ...
}

  相对地,从 Spring 4.2 开始,考虑使用addCustomFormatter来指定Formatter实现以代替PropertyEditor实例。如果你恰好在一个共享的FormattingConversionService中也有一个个基于Formatter的设置(setup),这会非常用,同样的规则可以用重用于控制器指定的绑定规则的变化:

@Controller
public class MyFormController 
{
    @InitBinder
    protected void initBinder(WebDataBinder binder) 
    {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
    // ...
}

② 配置一个自定义的WebBindingInitializer

  为了表达(externalize)数据绑定初始化,你可以提供一个自定义的WebBindingInitializer接口实现,然后你可以通过为RequestMappingHandlerAdapter来提供一个自定义 Bean 配置来启动WebBindingInitializer,所以要重写默认配置。

  下面的例子来自 PetClinic 应用程序(虽然文档上说了一下,可我也不知道这个项目在哪里……),展示了一个配置,使用一个自定义WebBindingInitializer接口实现——org.springframework.samples.petclinic.web.ClinicBindingInitializer,它配置的PropertyEditors需要几个控制器。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="cacheSeconds" value="0"/>
    <property name="webBindingInitializer">
        <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer"/>
    </property>
</bean>

  @InitBinder方法也可以定义在一个带有@ControllerAdvice注解的类中,在这种情况下,它们用于匹配控制器。这提供了一个使用WebBindingInitializer的代替方法。详情见“使用@ControllerAdvice@RestControllerAdvice通知控制器一节”。

    原文作者:行一
    原文地址: https://segmentfault.com/a/1190000007013461
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞