2

事前に助けてくれてありがとう。

コントローラーメソッドの 1 つが JSON を返すようにしようとしています。簡単なテストから始めます。

@RequestMapping(value="/myReqPath", method=RequestMethod.GET)
@ResponseBody
public Map<String, String> myJsonMethod() {

    Map<String, String> response = new TreeMap<String, String>();
    response.put("test", "test");

    return response;

}

<mvc:annotation-driven/>これを達成するには、サーブレット コンテキストに追加する必要があることを理解しています。問題は、それを追加すると、カスタムの AnnotationMethodHandlerAdapter が壊れてしまうことです。

<mvc:annotation-driven/>[B]コントローラから JSON を返すために必要な部分を抽出して追加するにはどうすればよいですか?[/B]

私のサーブレット構成の関連部分は次のとおりです。

<!--Skipping this for now...
<mvc:annotation-driven/>
-->

<!-- JSON Marshaling -->
<util:constant id="jsonBasicClassIntrospector"
    static-field="org.codehaus.jackson.map.introspect.BasicClassIntrospector.instance" />
<bean id="jsonJaxbAnnotationIntrospector" 
    class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" />
<bean id="jsonVisibilityChecker" 
    class="org.codehaus.jackson.map.introspect.VisibilityChecker.Std"
    factory-method="defaultInstance" />
<bean id="jsonDefaultTypeFactory" 
    class="org.codehaus.jackson.map.type.TypeFactory"
    factory-method="defaultInstance" />
<bean id="jsonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
    <property name="serializationConfig">
        <bean class="org.codehaus.jackson.map.SerializationConfig">
            <constructor-arg ref="jsonBasicClassIntrospector" />
            <constructor-arg ref="jsonJaxbAnnotationIntrospector" />
            <constructor-arg ref="jsonVisibilityChecker" />
            <constructor-arg><null/></constructor-arg>
            <constructor-arg><null/></constructor-arg>
            <constructor-arg ref="jsonDefaultTypeFactory" />
            <constructor-arg><null/></constructor-arg>
        </bean>
    </property>
    <property name="deserializationConfig">
        <bean class="org.codehaus.jackson.map.DeserializationConfig">
            <constructor-arg ref="jsonBasicClassIntrospector" />
            <constructor-arg ref="jsonJaxbAnnotationIntrospector" />
            <constructor-arg ref="jsonVisibilityChecker" />
            <constructor-arg><null/></constructor-arg>
            <constructor-arg><null/></constructor-arg>
            <constructor-arg ref="jsonDefaultTypeFactory" />
            <constructor-arg><null/></constructor-arg>
        </bean>
    </property>
</bean>

...

<!-- My custom  AnnotationMethodHandlerAdapter... -->
<bean id="sessionArgResolver" class="com.SessionParamArgumentResolver"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver" ref="sessionArgResolver"/>
</bean>

現状では、コントローラ メソッドが呼び出されますが、ブラウザは http ステータス 406: 406 Not Acceptable - [url]http://localhost:8080/myApp/myReqPath[/url] を返します。

4

1 に答える 1

3

カスタムAnnotationMethodHandlerAdapter宣言が既にある場合は、それにHttpMessageConverters のリストを追加するだけです。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver" ref="sessionArgResolver"/>
    <property name = "messageConverters">
        <list>
            <bean 
                class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name = "objectMapper" ref = "jsonObjectMapper" />
            </bean>
        </list>
    </property>
</bean> 
于 2012-04-19T13:48:44.580 に答える