json - Spring 配置 - mvc :annotation-driven, AnnotationMethodHandlerAdapter 和 JSON

标签 json spring-mvc annotations

预先感谢任何帮助。

我正在尝试让我的 Controller 方法之一返回 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/>添加到我的 servlet 上下文中以实现此目的。问题是当我添加它时,它破坏了我的自定义 AnnotationMethodHandlerAdapter。

[B]如何提取并添加 <mvc:annotation-driven/> 的所需部分从 Controller 返回 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>

就目前情况而言,我的 Controller 方法被调用,但是浏览器返回 http 状态 406: 406 Not Acceptable - [url]http://localhost:8080/myApp/myReqPath[/url]

最佳答案

如果您已经有自定义 AnnotationMethodHandlerAdapter 声明,则只需向其中添加 HttpMessageConverter 列表即可:

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

关于json - Spring 配置 - mvc :annotation-driven, AnnotationMethodHandlerAdapter 和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229266/

相关文章:

java - Spring 网络服务 :what are SAAJ and AXIOM

Java 中 C# XmlSerializer 的 XmlIninclude 等效项

hibernate - Spring MVC、Hibernate 3 和@Valid 问题

c# - 获取 ConfigurationSection 的初始 JSON 表示

javascript - 获取 json 对象中的第一项

Jquery getJSON 自动按 id 对我的数据进行排序

spring-mvc - 如何自定义请求参数的分割模式

java - 为什么我无法发送正确的服务器状态作为响应,而是在到达端点时收到 "no response"?

jsf - Init 方法在@Viewscoped bean 中被调用两次

json - 如何在 Swift 中解码 HTML 实体?