有没有办法让所有注册的消息转换器?

问题描述:

我想以某种方式注入到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类可以注入,可能有一个属性,我可以用它来获取转换器?理想情况下,我希望看到它们在过滤器链中的订单。

您是对的,消息转换器直接在使用<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

春天把所有的转换器org.springframework.core.convert.ConversionService实现后面。您需要注入接口的实例到类,你可以阅读更多的春天documentation(包括如何注入它的一个例子)。

您可以尝试注入RequestMappingHandlerAdapter类型的豆,但根据您的配置,您可能没有一个实例!

+0

谢谢,这就是我从Biju的回答http://*.com/a/11970698/140037 – 2016-11-25 13:19:29