这一部分示例见这个项目的 mvc 分支下的 WebDataBinderController.java
① 用@InitBinder
自定义数据绑定
用@InitBinder
注解的控制器方法,允许你直接在你的控制器类中配置 Web 数据绑定。@InitBinder
标记初始化WebDataBinder
的方法,WebDataBinder
被用于填充被注解的处理方法的命令和表单对象参数。
这些初始化绑定器(Init-binder)方法支持@RequestMapping
方法支持的所有参数,处理命令/表单对象以及相关的校验结果对象。初始化绑定器方法必须不带返回值,所以它们通常被声明为 void 的。典型的参数包括WebDataBinder
和WebRequest
或者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
通知控制器一节”。