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

Jaa*_*nus 83 javascript java ajax spring json

这是我的javascript:

    function getWeather() {
        $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
            alert('Success');                               
        });
    }
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
@ResponseBody
public Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}
Run Code Online (Sandbox Code Playgroud)

为spring-servlet.xml

<context:annotation-config />
<tx:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

得到此错误:

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)
Run Code Online (Sandbox Code Playgroud)

头:

响应标题

Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  1070
Date    Sun, 18 Sep 2011 17:00:35 GMT
Run Code Online (Sandbox Code Playgroud)

请求标题

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
Run Code Online (Sandbox Code Playgroud)

有趣的说明:

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

 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=?
Run Code Online (Sandbox Code Playgroud)

问题是什么?在之前有两个类似的问题,我尝试了所有接受的提示,但我认为它们不起作用......

有什么建议?随意问的问题...

小智 106

406不可接受

由请求标识的资源仅能够根据请求中发送的接受报头生成具有不可接受的内容特征的响应实体.

因此,您的请求接受标头是application/json,您的控制器无法返回该标头.当无法找到正确的HTTPMessageConverter来满足@ResponseBody带注释的返回值时,会发生这种情况.在<mvc:annotation-driven>给定类路径中的某些3-d方库时,使用HTTPMessageConverter会自动注册.

您在类路径中没有正确的Jackson库,或者您没有使用该 <mvc:annotation-driven>指令.

我成功复制了你的场景,使用这两个库并没有headers="Accept=*/*"指令它工作正常.

  • 杰克逊核心ASL-1.7.4.jar
  • 杰克逊映射器-ASL-1.7.4.jar


bek*_*kur 74

我有同样的问题,从最新的Spring 4.1.1开始,你需要将以下jar添加到pom.xml.

<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>
Run Code Online (Sandbox Code Playgroud)

还要确保你有以下jar:

<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>
Run Code Online (Sandbox Code Playgroud)

406 Spring MVC Json,根据请求"接受"标题是不可接受的

  • 您能否提供Springs官方文档中记录的内容?怎么会有人知道这是问题所在? (4认同)

kdg*_*ory 15

还有另一种情况会返回此状态:如果Jackson映射器无法弄清楚如何序列化bean.例如,如果您有两个相同布尔属性的访问器方法,isFoo()getFoo().

发生的事情是Spring的MappingJackson2HttpMessageConverter调用Jackson的StdSerializerProvider来查看它是否可以转换你的对象.在调用链的底部,StdSerializerProvider._createAndCacheUntypedSerializer抛出一条JsonMappingException带有信息的消息.但是,这个异常被吞噬了StdSerializerProvider._createAndCacheUntypedSerializer,这告诉Spring它无法转换对象.由于转换器耗尽,Spring报告说它没有给出Accept它可以使用的标题,这当然是在你给它的时候是假的*/*.

这种行为有一个错误,但它被关闭为"无法重现":被调用的方法没有声明它可以抛出,因此吞咽异常显然是一个合适的解决方案(是的,这是讽刺).不幸的是,杰克逊没有任何记录......并且在代码库中有很多评论希望它能做到,所以我怀疑这不是唯一隐藏的问题.


ato*_*ott 14

我遇到了同样的问题,我的控制器方法执行但响应是错误406.我调试AbstractMessageConverterMethodProcessor#writeWithMessageConverters并发现该方法ContentNegotiationManager#resolveMediaTypes总是返回text/html不支持的方法MappingJacksonHttpMessageConverter.问题是, org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy工作早于org.springframework.web.accept.HeaderContentNegotiationStrategy我的请求的扩展和我的/get-clients.html错误406的问题的原因.我刚刚更改了请求网址/get-clients.


小智 9

确保jar课程路径中存在以下2 .

如果缺少任何一个或两个,则会出现此错误.

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar
Run Code Online (Sandbox Code Playgroud)


Jaa*_*nus 6

终于从这里找到了答案:

将restful ajax请求映射到spring

我引用:

@RequestBody/@ ResponseBody注释不使用普通的视图解析器,它们使用自己的HttpMessageConverters.为了使用这些注释,您应该在AnnotationMethodHandlerAdapter中配置这些转换器,如引用中所述(您可能需要MappingJacksonHttpMessageConverter).


Ria*_*adh 5

确保发送的对象(在本例中为天气)包含 getter/setter