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
并将所有内容连接在一起即可。
链接
- PropertyEditorRegistrar javadoc
- ConfigurableWebBindingInitializer javadoc
- 参考指南链接