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

IT技术 java javascript ajax json spring
2021-02-07 12:47:34

这是我的javascript:

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

这是我的控制器:

@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

<context:annotation-config />
<tx:annotation-driven />

收到此错误:

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

标题:

响应头

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

请求头

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 错误,但同时休眠查询有效。 这就是 tomcat log 所说的,每次我在 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=?

可能是什么问题?之前在 SO 中有两个类似的问题,我尝试了那里所有接受的提示,但我猜它们没有用......

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

6个回答

406 不可接受

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

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

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

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

  • jackson-core-asl-1.7.4.jar
  • jackson-mapper-asl-1.7.4.jar
你有类似的东西: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">和 spring-web-3.0.x 和 spring-webmvc-3.0.x 罐子?
2021-03-14 12:47:34
不,那不是问题,请检查我的答案。
2021-03-20 12:47:34
啊,我那里没有那个架构定位……但是谢谢,这对我有帮助。我认为这tx:annotation-drivenmvc:annotation-drive或 smthin相同
2021-03-25 12:47:34
如果手动配置 HttpMessageConverters 解决了您的问题,那么使用 mvc:annotation-driven 的作用与它自动配置转换器和 HandlerAdapters(HA) 的作用相同。请注意,如果您明确配置任何 HA,它将取消所有其他默认设置。
2021-03-26 12:47:34
嗯,那是什么mvc我用过<tx:annotation-driven />,tx 是xmlns:tx="http://www.springframework.org/schema/tx"
2021-04-05 12:47:34

我有同样的问题,从最新的 Spring 4.1.1 开始,您需要将以下 jars 添加到 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>

还要确保您有以下 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>

406 Spring MVC Json,根据请求“接受”标头不可接受

这个答案是最佳答案的 Maven 感知版本,它完美地工作!Maven 异常可以更清楚地了解幕后实际发生的事情。
2021-03-24 12:47:34
您能否提供 Springs 官方文档中记录的位置?有人怎么知道这是问题所在?
2021-03-24 12:47:34
这仅在添加后两个依赖项后对我有用。谢谢。
2021-03-29 12:47:34
您只需要指定 jackson-databind 和 jackson-mapper-asl 的依赖关系,另外两个是传递依赖关系,无论如何都会被解析。
2021-04-01 12:47:34
你绝对不需要两者。Spring 将为MappingJacksonHttpMessageConverterJackson 1 和MappingJackson2HttpMessageConverterJackson 2添加。它们中的每一个都足以序列化/反序列化 JSON。您只需要一个(使用 Jackson 2,因为它功能更丰富)。
2021-04-07 12:47:34

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

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

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

太感谢了!我是 Spring MVC 的新手,并且很难弄清楚如何返回 JSON。每个人都提到缺少@ResponseBody 注释和 Jackson 依赖项是 406 错误的原因。就我而言,事实证明我只是缺少属于我想作为 JSON 返回的对象的公共字段的访问器方法。
2021-03-26 12:47:34
谢谢@kdgregory!我忘了为字段添加 getter/setter。添加它们解决了这个问题。
2021-04-09 12:47:34

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

在我的情况下,它是一个带有扩展名的休息路径 ID(在测试中),出于同样的原因导致 406,而普通控制器工作(即使您要在休息路径 ID 中使用扩展名)。
2021-03-13 12:47:34
嗨 atott,我遇到了同样的问题,您关于更改请求扩展名的提示解决了我的问题。非常感谢您分享您的解决方案!!
2021-04-08 12:47:34

确保以下 2jar存在于类路径中。

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

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar