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

时间:2012-08-15 13:41:37

标签: java spring spring-mvc

我想以某种方式注入Spring-MVC中注册的所有HttpMessageConverter个实例。我可以通过注册成功注入所有已注册的内容。

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

但是,只有在转换器在上下文中注册时才会注入(即,如果在<annotation-driven>之外定义)。

我确实想过我会尝试在<beans:ref中使用<annotation-driven><message-converters>,但在spring-web 3.1中不支持。

是否有一些我可以注入的类可能具有我可以用来获取转换器的属性?理想情况下,我希望看到过滤器链中的订单也已注册。

3 个答案:

答案 0 :(得分:5)

您是对的,消息转换器直接在使用<mvc:annotation-driven/> xml标记注册的RequestMappingHandlerAdapter中实例化,而消息转换器子标签明确指望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 :(得分:4)

Spring将所有转换器置于org.springframework.core.convert.ConversionService的实现之后。您需要在该类中注入该接口的实例,您可以在spring documentation中阅读更多内容(包括如何注入它的示例)。

答案 2 :(得分:0)

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