5

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

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

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

我确实认为我会尝试<beans:ref在内部使用,<annotation-driven><message-converters>但 spring-web 3.1 不支持它。

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

4

3 回答 3

7

你是对的,消息转换器直接在使用<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>
于 2012-08-15T14:02:24.957 回答
4

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

于 2012-08-15T13:45:55.643 回答
0

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

于 2016-11-25T12:43:54.023 回答