Spring MVC所有控制器的一个初始化绑定器
问题内容:
我有5个控制器,我想InitBinder
向所有人注册一个。
我知道我可以将此代码添加到每个。
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.registerCustomEditor(StringWrapper.class, new StringWrapperEditor());
}
但是 我只想定义 一次 (甚至创建一个bean StringWrapperEditor
并使用它,而不是每次都创建new。)
我搜索了SO和其他一些地方,但没有找到任何answear。可能吗
我在Java 1.6中使用spring 3.1.1。
问题答案:
实现一个PropertyEditorRegistrar
注册所有自定义的PropertyEditors
。然后在您的配置中添加ConfigurableWebBindingInitializer
与创建的内容关联的,并将其关联PropertyEditorRegistrar
到HandlerAdapter
。
public class MyPropertyEditorRegistrar implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(StringWrapper.class, new StringWrapperEditor());
}
}
如果您<mvc:annotation-driven />
的配置中有一个标签,则问题在于,使用该标签您无法将其添加WebBindingInitializer
到适配器中,ConfigurableWebBindingInitializer
而已添加到预配置的HandlerAdapter
旁边。您可以使用a 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
。
如果没有标签,您可以简单地手动配置a RequestMappingHandlerAdapter
并将所有内容连接在一起。
链接