我试图让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.");
});
}
如果还有其他需要的信息,请告诉我。
答案 0 :(得分:14)
摆脱所有杰克逊豆,以及谈判解决方案中的json映射。 mvc:annotation-driven
应该配置Jackson序列化工作所需的一切。
答案 1 :(得分: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
我希望它会帮助别人。