0

~R

我正在尝试使用 Jackson 自动转换为 JSON 的 Spring MVC REST JSON 通道。尽管我按照其他 StackOverflow 问题中的建议做所有事情,但我得到了HttpMediaTypeNotAcceptableException并且我的 bean/列表没有转换为 JSON。我在Jetty上运行代码。

我已经按照Spring MVC 中的 UTF-8 编码问题Spring 3.0 使用 jackson 消息转换器Jackson 注释在 Spring 中被忽略的JSON 响应的说明进行操作,但是它们都不能让我既不能发送 bean 也不能发送List<String>. 两者都返回 HTTP 状态 406。只有返回 String 的方法以 HTTP 200 成功。

我的方法是:

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

弹簧文件:

<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 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 18.0) 壁虎/20100101 火狐/18.0

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

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

所以问题是,我在这里缺少什么?为什么杰克逊转换器没有注册/我该如何调试它?我正在通过jetty:run. 但这无关紧要,因为 Spring 是独立于应用程序服务器的。

4

1 回答 1

1

在你的@RequestMapping你有produces = "text/plain",但你的请求头说Accept application/json, text/javascript。没有比赛。

使用produces="application/json"或根本不使用produces。它的主要用例是为同一个 URL 提供不止一种方法,每种方法都以不同的格式(JSP、JSON、XML ...)产生输出。

于 2013-06-28T09:14:09.357 回答