`
helloman0907
  • 浏览: 29878 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Could not find acceptable representation解决办法

 
阅读更多

Could not find acceptable representation

Spring 4.0.x通过@ResponseBody标签返回JSON数据的方法都报406错:  Failed to load resource: the server responded with a status of 406 (Not Acceptable)  以及报错描述:

  The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ()   于是,百度、Google了半天,发现遇到此问题的人挺多的,但是都是说什么添加Jackson什么的,我是采用的fastjson,换成Jackson尝试了半天均还是406。   后来在stackoverflow有人说是Spring 3.2的存在BUG,但是我使用的是3.1.x,不再报406了,  虽然换回 3.1不报错了,但还是想看看在处理ajax返回json数据的方式上两个版本到底有何区别,debug之。 debug到

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(T returnValue,MethodParameter returnType,ServletServerHttpRequest inputMessage,ServletServerHttpResponse outputMessage)

在以下代码处抛出了异常:

if (compatibleMediaTypes.isEmpty()) {  
            throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes);  
        }

看 来是compatibleMediaTypes为空导致。看debug信息,经过比较发现3.1的requestedMediaTypes为[*/*], 而3.2的requestedMediaTypes却为[text/html],producibleMediaTypes都是[application /json],继而发现获取acceptableMediaTypes的方式3.1与3.2不同

3.1

private List<MediaType> getAcceptableMediaTypes(HttpInputMessage inputMessage) {  
try {  
List<MediaType> result = inputMessage.getHeaders().getAccept();  
return result.isEmpty() ? Collections.singletonList(MediaType.ALL) : result;  
} catch (IllegalArgumentException ex) {  
if (logger.isDebugEnabled()) {  
logger.debug("Could not parse Accept header: " + ex.getMessage());  
}  
return Collections.emptyList();  
}  
}

3.2

private List<MediaType> getAcceptableMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException {  
            List<MediaType> mediaTypes = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request));  
            return mediaTypes.isEmpty() ? Collections.singletonList(MediaType.ALL) : mediaTypes;  
        }

4.0.x

private List<MediaType> getAcceptableMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException {
List<MediaType> mediaTypes = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request));
return (mediaTypes.isEmpty() ? Collections.singletonList(MediaType.ALL) : mediaTypes);
}

 

看来问题就是出在这里了。不知Spring为何改变该实现方式??!!

解决方法如下:

第一种:

退回3.1.x

 

第二种:

<?xml version="1.0" encoding="UTF-8"?>  
   <beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
   xmlns:mvc="http://www.springframework.org/schema/mvc"  
 
  xsi:schemaLocation="http://www.springframework.org/schema/beans  
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  http://www.springframework.org/schema/context  
  http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  http://www.springframework.org/schema/aop  
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  http://www.springframework.org/schema/tx   
  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  http://www.springframework.org/schema/mvc    
  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"

把spring-mvc-3.0.xsd 升级到  spring-mvc-3.2.xsd

<?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
      
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    http://www.springframework.org/schema/aop  
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/tx   
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
   http://www.springframework.org/schema/mvc   
   http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

然后把<mvc:annotation-driven>修改成如下格式

<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="false" />   
<property name="ignoreAcceptHeader" value="false" />   
<property name="mediaTypes" >   
<value>  
atom=application/atom+xml  
html=text/html  
json=application/json  
*=*/*  
</value>   
</property>  
</bean>

  三、第三种

详情见下面的地址 点击打开链接(主要针对3.2.X)

四、第四种

spring 3.2时requestedMediaTypes却为[text/html]的情况报406错误,还有一个原因可能是由于采用的后缀有关,如果使 用*.htm,*.html等,默认就会采用[text/html]编码,若改成*.json,*.shtml等就OK!!

分享到:
评论

相关推荐

    Whether mandatory donation is acceptable or not?

    强制性捐赠是否可接受? 强制性捐赠,尤其是针对学生群体,引发了广泛的讨论。在这个问题上,学校要求每位学生向有需要的人捐赠至少10元,虽然其初衷可能是为了筹集资金帮助贫困者,但这种做法是否恰当,需要深入...

    利用dcmtk实现C-FIND SCU

    专栏博文“DICOM:基于DCMTK实现C-FIND SCU”中对应的源代码。基于dcmtk开源库中的findscu工程,实现的简单的C-FIND SCU,用于示范如何使用dcmtk操作实现具体的DICOM应用。

    socket网络编程讲解

    /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return 1; } /* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater */ /* ...

    C++常见错误及解决方案

    **错误信息**: `error C2676: binary ‘&gt;&gt;’: ‘class std::basic_ostream, struct std::char_traits&lt;char&gt;&gt;’ does not define this operator or a conversion to a type acceptable to the predefined operator` ...

    Resizes Images to sizes acceptable by half life for transiti

    Resizes Images to sizes acceptable by half life for transitioning into pldecal.wad files This code is incomplete... A Majority of the programming has been accomplished.

    SpringMVC框架中传递JSON数据时前台报406错误解决办法

    然而,在实际操作中,我们可能会遇到一个常见的问题,即HTTP状态码406(Not Acceptable)。这个错误通常意味着服务器生成了响应,但客户端无法接受它,因为响应的格式不在其可接受的类型列表中。本篇文章将深入探讨...

    ANSI-ASHRAE Standard 62.1-2019 Ventilation for Acceptable Indoor

    文件“ANSI-ASHRAE Standard 62.1-2019 Ventilation for Acceptable Indoor Air Quality - 完整英文版(92页).pdf”提供了标准的全文,包含详细的技术要求、计算方法和实施建议。读者可以通过这份文档深入了解如何...

    elasticsearch-head

    ## Synopsis ... ## Motivation This was created because ElasticSearch 5 removed the ability to run ElasticSearch Head as an Elastic Plugin. This offers an alternative to self-hosting in your own web ...

    A simulation to find the optimized sizes of microgrid component

    A simulation to find the optimized sizes of microgrid components (PV and battery) constrained by a certain acceptable loss of load percentage and by budget. This simulation is written by Stefano ...

    Crawler.zip

    【Crawler.zip】是一个包含网络爬虫资源的压缩文件,主要使用Java编程语言实现。网络爬虫,也称为网页蜘蛛或网络机器人,是一种自动化程序,它遍历互联网上的页面,收集信息并存储在数据库中,以便于后续的数据分析...

    PyPI 官网下载 | django-extra-exceptions-1.0.0.tar.gz

    "django-extra-exceptions"扩展了Django的异常体系,提供了一些新的异常类,如`Http404NotAcceptable`(HTTP 406 Not Acceptable)、`PermissionDenied403`(HTTP 403 Forbidden)、`InvalidToken`(用于处理令牌...

    bios.wph提取工具

    BIOS(基本输入输出系统)是计算机启动时加载的第一个软件,它包含了控制硬件设备和操作系统交互的基本指令。在计算机硬件升级或修复过程中,有时需要对BIOS进行更新或提取特定文件,例如`bios.wph`。...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    Do not depend on the symbol being brought in transitively via headers not directly included. One exception is if Foo is used in myfile.cc, it's ok to #include (or forward-declare) Foo in myfile.h, ...

    Tomcat常见的错误代码

    - **406 Not Acceptable**: 找到了资源,但MIME类型与客户端请求不兼容。 - **407 Proxy Authentication Required**: 需要通过代理服务器认证。 - **408 Request Timeout**: 在规定时间内未收到客户端的请求。 - **...

    20种VC++编译错误信息

    本文将详细介绍20种常见的VC++编译错误信息,并针对每一种错误提供可能的原因及解决办法。 ### 1. 错误 C2065: 'identifier': undeclared identifier - **描述**:当编译器遇到一个未声明的标识符时,会出现此错误...

    EPIMap: Using Epimorphism to Map Applications on CGRAs

    EPIMap was able to achieve the theoretical best performance for 9 out of 14 benchmarks, while EMS could not achieve the theoreti- cal best performance for any of the benchmarks. EPIMap achieves ...

    hht 数字错误信息

    **HTTP 406 Not Acceptable** - **描述**:客户端请求的资源不被服务器所支持,无法用可接受的格式表示。 - **原因**:服务器无法按照客户端的要求返回数据。 - **解决方法**:检查客户端对媒体类型的支持。 ####...

    SIP_协议消息应答代码解释详录

    - 406 Not Acceptable:请求不被服务器接受。 - 407 Proxy Authentication Required:需要代理服务器认证。 - 408 Request Timeout:在规定时间内未能找到用户。 - 410 Gone:用户已不存在。 - 413 Request Entity ...

    NGN下一代网络 sip中继经常用到的sip代码

    - **406 Not Acceptable**:服务器无法按请求的方式提供资源。 - **407 Proxy Authentication Required**:需通过代理进行身份验证。 - **408 Request Timeout**:请求超时,没有在规定时间内收到完整请求。 - **410...

Global site tag (gtag.js) - Google Analytics