spring mvc one init binder适用于所有控制器

我有5个控制器,我想向所有人注册一个InitBinder

我知道我可以将这些代码添加到每个代码中。

 @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(StringWrapper.class, new StringWrapperEditor()); } 

我想只定义一次 (甚至创建一个StringWrapperEditor的bean并使用它而不是每次都创建新的。)

我搜索了SO和其他一些地方,但没有发现任何安装。 它甚至可能吗?

我使用Spring 3.1.1与java 1.6。

实现PropertyEditorRegistrar ,它注册所有自定义PropertyEditors 。 然后在您的配置中添加一个ConfigurableWebBindingInitializer ,您可以与创建的PropertyEditorRegistrar连接,并将其挂钩到HandlerAdapter

 public class MyPropertyEditorRegistrar implements PropertyEditorRegistrar { public void registerCustomEditors(PropertyEditorRegistry registry) { registry.registerCustomEditor(StringWrapper.class, new StringWrapperEditor()); } } 

如果您的配置中有标记,则问题是使用此标记时,您无法将WebBindingInitializer添加到适配器旁边,因为已经为预配置的HandlerAdapter添加了ConfigurableWebBindingInitializer 。 您可以使用BeanPostProcessor来处理和配置bean。

 public class MyPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { if (bean instanceof RequestMappingHandlerAdapter) { WebBindingInitializer wbi = ((RequestMappingHandlerAdapter) bean).getWebBindingInitializer(); if (wbi == null) { wbi = new ConfigurableWebBindingInitializer(); ((RequestMappingHandlerAdapter) bean).setWebBindingInitializer(wbi); } if (wbi instanceof ConfigurableWebBindingInitializer) { ((ConfigurableWebBindingInitializer) wbi).setPropertyEditorRegistrar(new MyPropertyEditorRegistrar()); } } } } 

需要一些工作,但它是可行的。 您还可以实现自己的WebBindingInitializer

如果您没有标签,则只需手动配置RequestMappingHandlerAdapter并将所有内容连接在一起即可。

链接

  1. PropertyEditorRegistrar javadoc
  2. ConfigurableWebBindingInitializer javadoc
  3. 参考指南链接