5

HttpMessageConverterSpring-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

メッセージ コンバーターは、xml タグを使用して登録された RequestMappingHandlerAdapter 内で直接インスタンス化され、メッセージ コンバーター サブタグ<mvc:annotation-driven/>は、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 に答える