2012-08-15 125 views
4

我想以某種方式注入到Spring的MVC註冊的所有HttpMessageConverter實例。我可以成功注入所有已註冊的通過。有沒有辦法讓所有註冊的消息轉換器?

private HttpMessageConverter[] converters; 
@Autowired 
public void setConverters(HttpMessageConverter[] converters) { 
    this.converters = converters; 
} 

但是,如果轉換器是在上下文中註冊此僅注入(即,如果的<annotation-driven>外面所定義的)。

我做了圖我會嘗試在<annotation-driven><message-converters>內使用<beans:ref,但它在spring-web 3.1中不支持。

有一些I類可以注入,可能有一個屬性,我可以用它來獲取轉換器?理想情況下,我希望看到它們在過濾器鏈中的訂單。

回答

5

您是對的,消息轉換器直接在使用<mvc:annotation-driven/> xml標記註冊的RequestMappingHandlerAdapter中實例化,並且message-converters子標籤明確期望bean被內聯定義。

然而,一個解決辦法是定義處理程序適配器和轉換器這種方式注入:

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService"></property> 
      <property name="validator"> 
       <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> 
       </bean> 
      </property> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="byteArrayConverter"/> 
      <ref bean="jaxbConverter"/> 
      <ref bean="jsonConverter"/> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
     </list> 
    </property> 
</bean> 

<bean name="byteArrayConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
<bean name="jaxbConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
<bean name="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="useSuffixPatternMatch" value="false"></property> 
</bean> 
+1

啊,你一直是最優秀的。 RequestMappingHandlerAdapter提示已經告訴我我需要知道的一切。我現在可以'@ Autowire'一個'RequestMappingHandlerAdapter'實例並調用它的'getMessageConverters()'方法,這將返回一個數組,該數組似乎是按照已註冊的順序排列的。 FWIW我不想對此進行修改,我只是想報告哪些轉換器已註冊並按照哪個順序。信息 – 2012-08-15 14:52:12

+0

一個額外的位,我打電話getMessageConverters()在我的@Autowire構造。那時,所有的消息轉換器都沒有被註冊。對我而言,在我需要使用getMessageConverters()之前調用getMessageConverters()。 – ptsw 2014-12-27 19:45:29

4

春天把所有的轉換器org.springframework.core.convert.ConversionService實現後面。您需要注入接口的實例到類,你可以閱讀更多的春天documentation(包括如何注入它的一個例子)。

0

您可以嘗試注入RequestMappingHandlerAdapter類型的豆,但根據您的配置,您可能沒有一個實例!

+0

謝謝,這就是我從Biju的回答http://stackoverflow.com/a/11970698/140037 – 2016-11-25 13:19:29

相關問題