首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring JSON请求获取406 (不可接受)

Spring JSON请求获取406 (不可接受)
EN

Stack Overflow用户
提问于 2011-09-18 22:42:48
回答 21查看 211K关注 0票数 86

这是我的javascript:

代码语言:javascript
复制
    function getWeather() {
        $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
            alert('Success');                               
        });
    }

这是我的控制器:

代码语言:javascript
复制
@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
@ResponseBody
public Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}

spring-servlet.xml

代码语言:javascript
复制
<context:annotation-config />
<tx:annotation-driven />

获取此错误:

代码语言:javascript
复制
GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

标头:

响应头

代码语言:javascript
复制
Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  1070
Date    Sun, 18 Sep 2011 17:00:35 GMT

请求头

代码语言:javascript
复制
Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept  application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/web/weather
Cookie  JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4

有趣的注解:

我得到了406错误,但hibernate查询同时工作。这是tomcat日志所说的,每次我在dropbox中更改选择时:

代码语言:javascript
复制
 select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=?

问题会是什么呢?在SO之前有两个类似的问题,我尝试了所有被接受的提示,但我猜它们不起作用…

有什么建议吗?请随时提问...

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2011-09-19 18:11:01

406不可接受的

请求所标识的资源只能根据请求中发送的accept头部生成内容特征不可接受的响应实体。

所以,你的请求接受头是application/json,而你的控制器不能返回它。当找不到正确的HTTPMessageConverter来满足@ResponseBody带注释的返回值时,就会发生这种情况。当您使用<mvc:annotation-driven>时,给定类路径中的某些3D参与库,HTTPMessageConverter会自动注册。

要么您的类路径中没有正确的Jackson库,要么您没有使用<mvc:annotation-driven>指令。

我成功地复制了您的场景,并且使用这两个库可以很好地工作,并且没有使用headers="Accept=*/*"指令。

  • jackson-core-asl-1.7.4.jar
  • jackson-mapper-asl-1.7.4.jar
票数 110
EN

Stack Overflow用户

发布于 2014-10-29 03:07:50

我也遇到了同样的问题,从最新的Spring4.1.1开始,您需要向pom.xml添加以下jars。

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.1.1</version>
</dependency>

还要确保您有以下jar:

代码语言:javascript
复制
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

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

406 Spring MVC Json, not acceptable according to the request "accept" headers

票数 74
EN

Stack Overflow用户

发布于 2012-08-16 09:36:14

还有另一种情况会返回此状态:如果Jackson映射器无法确定如何序列化bean。例如,如果同一布尔属性有两个访问器方法,即isFoo()getFoo()

发生的事情是Spring的MappingJackson2HttpMessageConverter调用Jackson的StdSerializerProvider来查看它是否可以转换您的对象。在调用链的底部,StdSerializerProvider._createAndCacheUntypedSerializer抛出一个带有信息性消息的JsonMappingException。然而,这个异常被StdSerializerProvider._createAndCacheUntypedSerializer接受了,它告诉Spring它不能转换对象。由于转换器用完了,Spring报告说它没有得到一个可以使用的Accept头,当你给它提供*/*时,这当然是假的。

对于这种行为有一个bug,但它被关闭为“无法重现”:被调用的方法没有声明它可以抛出,所以吞噬异常显然是一个合适的解决方案(是的,这是讽刺)。不幸的是,Jackson没有任何日志记录...而且在代码库中有很多评论希望它这样做,所以我怀疑这不是唯一隐藏的陷阱。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7462202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档