Spring 3.1.2和Jackson 1.9.11的HttpMediaTypeNotAcceptableException

时间:2013-06-28 07:11:23

标签: json spring rest spring-mvc jackson

〜 - [R

我正在尝试使用Jackson自动转换为JSON的Spring MVC REST JSON通道。虽然我正在按照其他StackOverflow问题中的建议执行所有操作,但我得到HttpMediaTypeNotAcceptableException并且我的bean /列表未转换为JSON。我在 Jetty 上运行代码。

我已经按照UTF-8 encoding problem in Spring MVCSpring 3.0 making JSON response using jackson message converterJackson annotations being ignored in Spring的说明进行了操作,但是没有一个能让我既不发送bean也不发送List<String>。两者都返回HTTP状态406.只有返回String的方法才能成功使用HTTP 200。

我的方法是:

@RequestMapping(value = "/list", produces = "text/plain; charset=utf-8")
public @ResponseBody List<String> getList() {
    return createList();
}

Spring文件:

<context:component-scan base-package="de.myapp.rest" />
<context:annotation-config />
<mvc:annotation-driven />

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter" />
        </list>
    </property>
</bean> 

添加此部分也无济于事:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
  <property name="mediaTypes">
    <map>
      <entry key="json" value="application/json"/>
    </map>
   </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
    </list>
  </property>
</bean> 

请求HTTP标头由jQuery生成,如下所示:

  

接受application / json,text / javascript, / ; Q = 0.01   Accept-Encoding gzip,deflate   Accept-Language de-de,de; q = 0.8,en-us; q = 0.5,en; q = 0.3   用户代理Mozilla / 5.0(Windows NT 6.1; WOW64; rv:18.0)Gecko / 20100101   火狐/ 18.0

但是,我收到带有HTML错误消息的HTTP 406,以及日志文件中的以下行:

  

解决处理程序[public de.myapp.rest.TestBean]中的异常   de.myapp.rest.Test.getList()]:   org.springframework.web.HttpMediaTypeNotAcceptableException:不能   找到可接受的代表

所以问题是,我在这里缺少什么?为什么没有注册jackson转换器/我该如何调试它?我正在通过jetty:run运行代码。但是不应该重要,因为Spring是独立于应用程序服务器的。

1 个答案:

答案 0 :(得分:1)

@RequestMapping produces = "text/plain" Accept application/json, text/javascript,您的请求标题为produces="application/json"。没有比赛。

使用produces或根本不使用{{1}}。它的主要用例是为同一个URL提供多个方法,每个方法以不同的格式(JSP,JSON,XML ......)生成输出。