Spring的Json没有得到适当的回应

时间:2010-07-27 00:59:36

标签: java json spring spring-mvc jackson

我试图让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条目,我不确定是否需要这些。在回到'时尚非json ajax'之前,我把它们放在那里作为最后的绝望行为。

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

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

来自回复: (406)此请求标识的资源只能根据请求“accept”标题()生成具有不可接受特征的响应。

我的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); 
}

在jsp上,进行ajax调用:

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

}

如果还有其他需要的信息,请告诉我。

8 个答案:

答案 0 :(得分:14)

摆脱所有杰克逊豆,以及谈判解决方案中的json映射。 mvc:annotation-driven应该配置Jackson序列化工作所需的一切。

答案 1 :(得分:3)

  1. 确保您返回的POJO有get()ers,每个字段一个。
  2. 即使您确定构建系统(Eclipse / Maven),也确保appserver(Tomcat)具有库。
  3. 我现在有两次这个错误。 刚才我把吸气剂添加到我的pojo中。 406错误消失了,我按预期获得了JSON。 我假设因为我的字段是受包保护的(默认访问),它会抓住它们,但我猜不是。 为了记录,如果它很重要,我还制作了POJO实现Serializable,toString(),serialVersionUID,no-arg构造函数和显式构造函数。

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

答案 2 :(得分:2)

另外,请确保添加两个与jackson相关的jar文件。

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

版本可能不同。

答案 3 :(得分:2)

我知道这是一个老线程,但也许有人会遇到和我一样的问题。将应用程序从Spring 4.0.3.RELEASE迁移到Spring 4.1.0.RELEASE时出现异常。在我的情况下,杰克逊从1.9.x更新到2.4.x就可以了。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

我不需要其他任何东西。

答案 7 :(得分:0)

可能我的答案有点晚了,但它可能有助于其他人访问这个问题。

我通过添加

解决了我的问题
 hibernate-validator-4.0.2 

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

解决了
slf4j-api-1.5.6.jar

我希望它会帮助别人。