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

Bre*_*yan 4 java spring spring-mvc

我想以某种方式注入HttpMessageConverterSpring-MVC中注册的所有实例.我可以成功注入所有已注册的内容.

private HttpMessageConverter[] converters;
@Autowired
public void setConverters(HttpMessageConverter[] converters) {
    this.converters = converters;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果转换器在上下文中注册(即,如果在外部定义<annotation-driven>),则仅注入.

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

是否有一些我可以注入的类可能有一个我可以用来获得转换器的属性?理想情况下,我希望看到他们注册的过滤器链中的顺序.

Bij*_*men 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>
Run Code Online (Sandbox Code Playgroud)

  • 啊,你已经是最优秀的了。`RequestMappingHandlerAdapter` 的提示告诉了我我需要知道的一切。我现在可以`@Autowire` 一个`RequestMappingHandlerAdapter` 实例并调用它的`getMessageConverters()` 方法,这将返回一个似乎按照注册顺序排列的数组。FWIW 我不想修改它,我只想报告哪些转换器已注册以及注册顺序。 (2认同)