【问题标题】:Spring's Json not being resolved with appropriate responseSpring的Json没有通过适当的响应得到解决
【发布时间】:2011-03-21 09:11:03
【问题描述】:

我尝试让 Spring 中的控制器使用 Jackson 类作为 recommended with 3.0 返回 JSON 响应,但无济于事。当然,我的课程路径中有 jackson 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.");
  });
}

如果需要更多信息,请告诉我。

【问题讨论】:

标签: java json spring spring-mvc jackson


【解决方案1】:

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

【讨论】:

  • 我也试过这个,但它对我不起作用。有任何想法吗?我的类路径中有杰克逊,我使用的是一个普通的旧对象,但它似乎仍然没有削减它。
【解决方案2】:

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

【讨论】:

  • 在@RequestBody 注释上使用produces="application/json" 怎么样。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

     hibernate-validator-4.0.2 
    

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

    slf4j-api-1.5.6.jar
    

    我希望它会对某人有所帮助。

    【讨论】:

      【解决方案5】:

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

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

      版本可以不同。

      【讨论】:

      • 是的,这就是我想念的东西。对于使用 @RequestBody@ResponseBody ,默认为 json 格式,并且将考虑使用 jackson jar 来转换您的 pojo。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:
        1. 确保您返回的 POJO 具有 get()ers,每个字段都有一个。
        2. 确保应用服务器 (Tomcat) 具有库,即使您确定构建系统 (Eclipse/Maven) 具有库也是如此。

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

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

        【讨论】:

          【解决方案8】:

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

          我通过更新 jackson 依赖项解决了这个问题

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

          我不需要其他任何东西。

          【讨论】:

            猜你喜欢
            • 2013-11-08
            • 2011-08-14
            • 1970-01-01
            • 2017-07-18
            • 1970-01-01
            • 2014-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多