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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring JSON请求获得406(不可接受)相关的知识,希望对你有一定的参考价值。

这是我的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错误,但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=?

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

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

答案

406不可接受

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

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

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

我成功地复制了你的场景,并且使用这两个库并且没有headers="Accept=*/*"指令它运行良好。

  • 杰克逊核心最174yara
  • 杰克逊尺寸最174yara
另一答案

我遇到了同样的问题,因为我错过了@EnableMvc注释。 (我的所有Spring配置都是基于注释的,XML等价物将是mvc:annotation-driven)

另一答案

作为@atott mentioned

如果你已经在你的pom.xml中添加了最新版本的Jackson,并且使用了Spring 4.0或更新版本,在你的动作方法上使用了@ResponseBody,而在@RequestMapping中配置了produces="application/json;charset=utf-8",那么你仍然有406(不可接受),我想你需要在MVC DispatcherServlet上下文配置中尝试此操作:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
</bean>

这就是我最终解决问题的方式。

另一答案

Spring 4.3.10:我使用以下设置来解决问题。

第1步:添加以下依赖项

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.6.7</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.7</version>
</dependency>
<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>

第2步:在MVC DispatcherServlet上下文配置中添加以下内容:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="favorParameter" value="true"/>
    <property name="ignoreAcceptHeader" value="false" />
</bean>

从Spring 3.2开始,按照默认配置将favorPathExtension设置为true,因为如果请求uri有任何适当的扩展,如.htm spring将优先扩展。在第2步中,我添加了contentNegotiationManager bean来覆盖它。

另一答案

可能没有人向下滚动这一点,但上述解决方案都没有为我修复它,但是制作了所有我的getter方法public

我把我的getter知名度保留在package-private;杰克逊决定找不到它们并且爆炸了。 (使用@JsonAutoDetect(getterVisibility=NON_PRIVATE)只能部分修复它。

另一答案

确保你的类路径中有正确的jackson版本

另一答案

检查为@joyfun做了正确的杰克逊版本,但也检查我们的标题...接受/可能不是由客户端传输...使用firebug或等效的检查您的获取请求实际发送的内容。我认为注释的头属性/可能/正在检查文字虽然我不是100%肯定。

另一答案

除了包含Spring servlet中所有可能的JAR,依赖项和注释之外,我还有一个我无法解决的明显问题。最终我发现我有错误的文件扩展名,我的意思是我有两个单独的servlet在同一个容器中运行,我需要映射到不同的文件扩展名,其中一个是“.do”,另一个用于订阅,随机命名为“。子”。所有好,但SUB是通常用于电影字幕文件的有效文件扩展名,因此Tomcat覆盖了标题并返回类似“text / x-dvd.sub ...”的内容所以一切都很好,但应用程序期待JSON但获得字幕因此,我所要做的就是更改我添加的web.xml文件中的映射:

<mime-mapping>
    <extension>sub</extension>
    <mime-type>application/json</mime-type>
</mime-mapping>
另一答案

我有同样的问题,遗憾的是,这里没有解决方案解决了我的问题,因为我的问题是在另一个班级。

我首先检查所有依赖关系是否已按照@bekur的建议到位,然后我检查了从客户端传输到服务器的请求/响应所有标头都已由Jquery正确设置。然后我检查了RequestMappingHandlerAdapter MessageConverters并且所有7个都到位了,我真的开始讨厌Spring了!然后我更新到Spring 4.0.6.RELEASE4.2.0.RELEASE我得到了另一个响应而不是上面的响应。这是Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type

这是我的控制器方法

  @RequestMapping(value = "/upload", method = RequestMethod.POST,produces = "application/json")
    public ResponseEntity<UploadPictureResult> pictureUpload(FirewalledRequest initialRequest) {

        DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) initialRequest.getRequest();

        try {
            Iterator<String> iterator = request.getFileNames();

            while (iterator.hasNext()) {
                MultipartFile file = request.getFile(iterator.next());
                session.save(toImage(file));
            }
        } catch (Exception e) {
            return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(),HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(), HttpStatus.OK);
    } 




    public class UploadPictureResult extends WebResponse{

    private List<Image> images;

    public void setImages(List<Image> images) {
        this.images = images;
    }
}






    public class WebResponse implements Serializable {


    protected String message;

    public WebResponse() {
    }

    public WebResponse(String message) {

        this.message = message;
    }


    public void setMessage(String message) {
        this.message = message;
    }
}

解决方案是使UploadPictureResult不扩展WebResponse

出于某种原因,Spring在扩展WebResponse时无法确定如何转换UploadPictureReslt

另一答案
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.0</version>
    </dependency>

我不使用ssl身份验证,这个jackson-databind包含jackson-core.jar和jackson-databind.jar,然后更改RequestMapping内容,如下所示:

@RequestMapping(value = "/id/{number}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
public @ResponseBody Customer findCustomer(@PathVariable int number){
    Customer result = customerService.findById(number);
    return result;
}

注意:如果你的产品不是“application / json”类型,我没有注意到这个并得到406错误,帮助这可以帮助你。

另一答案

检查这个帖子。 spring mvc restcontroller return json string p / s:你应该将jack子映射配置添加到你的WebMvcConfig类

@Override protected void configureMessageConverters( List<HttpMessageConverter<?>> converters) { // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON converters.add(new MappingJackson2HttpMessageConverter()); // and probably needs a string converter too for text/plain content-type strings to be properly handled converters.add(new StringHttpMessageConverter()); }

另一答案

我有同样的问题,从最新的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

以上是关于Spring JSON请求获得406(不可接受)的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC + JSON = 406 不可接受

406(不可接受)。尝试使用 @Responsebody 将对象或整数从 spring 处理函数返回到 ajax 请求

Spring-boot 执行器端点 - 406 不可接受

Spring @RestController,spring-boot 出现意外错误(类型=不可接受,状态=406)

spring mvc 不返回 json 内容 - 错误 406

android 改造后注销请求给出错误 406 不可接受:用户未登录。...在邮递员 api 上工作正常