2014-01-16 67 views
1

我有5個控制器,我想註冊一個InitBinder所有這些。春天MVC所有控制器的一個初始活頁夾

我知道我可以將這個代碼添加到他們每個人。

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

我想定義它只是一次(甚至創造的StringWrapperEditor一個bean,並使用它,而不是創造新的每次的。)

我搜索SO和其他一些地方,但沒有找到任何answear。 它甚至有可能嗎?

使用spring 3.1.1使用java 1.6使用1.6。

+1

使用Spring 3.2+,你應該能夠在'@ ControllerAdvice'註解的類來定義它。 –

+0

即時通訊使用彈簧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來處理和配置該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. 參考指南link
+0

您是否知道''在您自己的'聲明之前還是之後生成bean定義?如果是之前的版本,你能否找到它用於WebBindingInitializer的bean名稱,並聲明一個覆蓋它的「」? –

+0

我希望它會更容易:)生病試一試! – Udy

+0

你可以像@SotiriosDelimanolis建議的那樣嘗試檢測'ConfigurableWebBindingInitializer'而不是'RequestMappingHandlerAdapter',它可以爲你節省幾行。雖然我不確定是否將ConfigurableWebBindingInitializer實際添加爲上下文的bean。 –