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与创建的内容关联的,并将其关联PropertyEditorRegistrarHandlerAdapter

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并将所有内容连接在一起。

链接

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