2014-01-16 4 views
1

У меня есть 5 контроллеров, и я хотел бы зарегистрировать InitBinder для всех них.spring mvc one init binder для всех контроллеров

Я знаю, что могу добавить этот код к каждому из них.

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

Но я хотел бы определить его только раз (даже создать боб StringWrapperEditor и использовать его вместо того, чтобы создавать новый каждый раз.)

Я искал SO и некоторые другие места, но не нашел ответа. Возможно ли это?

Im using spring 3.1.1 с java 1.6.

+1

С весны 3.2+, вы должны быть в состоянии определить его в '@ ControllerAdvice' аннотированный класса. –

+0

im using spring 3.1.1 - отредактируйте вопрос – Udy

+1

См. [Здесь] (http://forum.spring.io/forum/spring-projects/web/84541-application-wide-initbinder). –

ответ

2

Внесите 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. Вы можете использовать BeanPostProcessor для обработки и настройки компонента.

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. Справочное руководство link
+0

Знаете ли вы, что '' генерирует определения bean до или после ваших собственных '' объявлений? Если бы это было раньше, не могли бы вы узнать, какое имя бина оно использует для своего 'WebBindingInitializer' и объявить' ', который перезаписывает его? –

+0

Я надеялся, что это будет проще :) плохо попробуй! – Udy

+0

Вы можете попробовать, как @SotiriosDelimanolis предложить, чтобы определить «ConfigurableWebBindingInitializer» вместо «RequestMappingHandlerAdapter», который сохранит вам пару строк. Хотя я не уверен, что 'ConfigurableWebBindingInitializer' фактически добавлен как компонент в контекст. –