4

MappingJacksonHttpMessageConverterのデフォルトのobjectMapperを置き換えたいと思います。

実用的な解決策を見つけましたが、満足していません。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/util
                       http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="org.mypackage.service"/>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <!--Adding the default message converters-->
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="writeAcceptCharset" value="false"/>
            </bean>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>

            <!--Adding our custom JSON converter-->
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper">
                    <util:constant static-field="org.mypackage.JsonUtils.MAPPER"/>
                </property>
            </bean>
        </list>
    </property>
</bean>

このソリューションは、メッセージコンバーターのカスタムリストを使用してRequestMappingHandlerAdapterクラスを初期化します。

デフォルトのメッセージコンバーター(コンストラクターからコピーしたもの)を追加する必要があったため、このソリューションは好きではありませんorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

デフォルトのコンバーターを追加しないと、コントローラーはapplication / jsonリクエストしか処理できず、application/xmlなどの他の基本的なリクエストを処理する方法を忘れてしまいました。

ありがとう。

4

1 に答える 1

4

Beanを宣言し、RequestMappingHandlerAdapterそれらすべてのコンバーターを手動で初期化することなく、コードを介してそれを行うことができます。BeanPostProcessor次のように、を書く必要があります。

public class MyBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            AnnotationMethodHandlerAdapter adapter = (AnnotationMethodHandlerAdapter) bean;
            HttpMessageConverter<?>[] converters = adapter.getMessageConverters();

            for (HttpMessageConverter<?> converter : converters) {
                if (converter instanceof MappingJacksonHttpMessageConverter) {
                    initConverter((MappingJacksonHttpMessageConverter) converter);
                }
            }
        } else  if(bean instanceof MappingJacksonHttpMessageConverter){
            initConverter((MappingJacksonHttpMessageConverter) bean);
        }
        return bean;
    }

    private void initConverter(MappingJacksonHttpMessageConverter converter) {
            MappingJacksonHttpMessageConverter jsonConverter = (MappingJacksonHttpMessageConverter) converter;
            final ObjectMapper mapper = // get your mapper from wherever
            jsonConverter.setObjectMapper(mapper);

            /* here you can apply any other configuration you wish*/
     }
}

そしてそれをBeanとして定義します:

<bean class="my.package.MyBeanPostProcessor" id="myBeanPostProcessor" lazy-init="false"/>

このようにして、実際に興味のあるものを正確に編集しますMappingJacksonHttpMessageConverter

于 2012-05-02T07:32:04.907 に答える