13

我尝试让 Spring 中的控制器使用3.0 推荐的 Jackson 类返回 JSON 响应,但无济于事。当然,我的课程路径中有杰克逊 jar 文件(jackson-core-asl-1.5.5.jar & jackson-mapper-asl-1.5.5.jar)。

至于 appconfig.xml 条目,我不确定我是否需要这些。我已经把它们放在那里作为最后的绝望行为,然后再回到 ol' 时尚非 json ajax。

在调试中,我观察控制器获取请求,返回 foo,然后在 firebug 中,得到 406。

错误消息如下:从记录器设置为调试时:org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示

从响应中: (406) 此请求标识的资源仅能够生成具有根据请求“接受”标头 () 不可接受的特征的响应。

我的 appconfig.xml 在这里:

    <!-- Configures support for @Controllers -->
    <mvc:annotation-driven />

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
  </property>
  <property name="viewResolvers">
    <list>
      <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"></property>
    </bean>

我的控制器

@RequestMapping(value="foo/bar", method=RequestMethod.GET)
public @ResponseBody foo getFoo(@RequestParam String fooId) {
    return new foo(fooId); 
}

在进行 ajax 调用的 jsp 上:

function addRow() {
  $.getJSON("foo/bar", {
    fooId: 1
  }, function(data) {
    alert("it worked.");
  });
}

让我知道是否需要更多信息。

4

8 回答 8

14

摆脱所有 Jackson bean,以及协商解析器中的 json 映射。应该配置杰克逊序列化工作所需的mvc:annotation-driven一切。

于 2010-07-27T07:39:00.920 回答
3
  1. 确保您返回的 POJO 具有 get()ers,每个字段都有一个。
  2. 即使您确定构建系统(Eclipse/Maven)有库,也要确保应用服务器(Tomcat)有库。

我现在有两次这个错误。刚才我在我的 pojo 中添加了吸气剂。406 错误消失了,我得到了预期的 JSON。我假设因为我的字段是包保护的(默认访问),它会抓住它们,但我猜不是。作为记录,以防万一,我还让 POJO 实现了 Serializable、toString()、serialVersionUID、无参数构造函数和显式构造函数。

上一次我清理/清除/刷新了我的 Tomcat 缓存并做了其他任何事情来强制它重新加载。我相信当我添加 Jackson 依赖项时,它修复了我的编译时错误,但是由于 tomcat 错过了它们,在运行时 Spring MVC 没有发现 Jackson 库,并产生了关于不可接受的响应类型的 406 错误。

于 2014-10-10T05:41:12.817 回答
2

从 spring 3.x 迁移到 spring 4.x 时,我遇到了同样的异常。

我通过更新杰克逊依赖项解决了它

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.1</version>
    </dependency>

我不需要其他任何东西。

于 2015-03-12T00:18:05.070 回答
2

另外,请确保添加两个杰克逊相关的 jar 文件。

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

版本可以不同。

于 2012-07-25T20:57:33.097 回答
2

我知道这是一个旧线程,但也许有人会遇到和我一样的问题。在将应用程序从 Spring 4.0.3.RELEASE 迁移到 Spring 4.1.0.RELEASE 时,我遇到了这个异常。在我的例子中,将 Jackson 从 1.9.x 更新到 2.4.x 就成功了。

于 2014-09-22T13:37:14.913 回答
1

发送 Accept: application/xml 标头不起作用。但是发送 Accept: application/json 实际上有效,并且 jackson mapper 开始工作。我摆脱了我的 406 并以 json 格式获取了我的序列化 java 对象,配置不超过 @ResponseBody 并返回 new MyObject() :) 感谢 skaffman信息,并感谢 Bozho 的工作标头值:D

于 2010-10-25T12:04:10.053 回答
1

这个问题在网上到处出现,我被它咬了几次。Spring 3.0.6(可能还有 5 个)在渲染 json 方面存在一些问题。一旦我更改为 3.1.0.RELEASE 版本,一切都按原样工作。无需任何配置更改。需要注意的是,返回方法必须有 @ResponseBody (如前面的示例),并且必须在 servlet-context.xml 或您的 spring 上下文配置文件中。

于 2012-03-30T23:38:24.083 回答
0

可能是我的回答有点晚了,但它可能会帮助其他人访问这个问题。

我通过添加解决了我的问题

 hibernate-validator-4.0.2 

并给了我另一个异常(类未找到异常:org.slf4j.LoggerFactory),我通过添加解决了

slf4j-api-1.5.6.jar

我希望它会帮助某人。

于 2012-06-27T07:12:36.060 回答