【问题标题】:Spring configuration - mvc:annotation-driven, AnnotationMethodHandlerAdapter, and JSONSpring配置——mvc:annotation-driven、AnnotationMethodHandlerAdapter、JSON
【发布时间】:2012-05-01 00:54:24
【问题描述】:

提前感谢任何帮助。

我正在尝试让我的控制器方法之一返回 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;

}

据我了解,我需要将 &lt;mvc:annotation-driven/&gt; 添加到我的 servlet 上下文中才能完成此操作。问题是当我添加它时,它会破坏我的自定义 AnnotationMethodHandlerAdapter。

[B]如何提取并添加&lt;mvc:annotation-driven/&gt; 的所需部分以从控制器返回JSON?[/B]

以下是我的 servlet 配置的相关部分:

<!--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 不可接受 - [url]http://localhost:8080/myApp/myReqPath[/url]

【问题讨论】:

    标签: json spring-mvc annotations


    【解决方案1】:

    如果您已经有一个自定义的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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-11-29
      • 2015-05-05
      • 1970-01-01
      • 2011-04-11
      • 2012-02-19
      相关资源
      最近更新 更多