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!!
相关推荐
强制性捐赠是否可接受? 强制性捐赠,尤其是针对学生群体,引发了广泛的讨论。在这个问题上,学校要求每位学生向有需要的人捐赠至少10元,虽然其初衷可能是为了筹集资金帮助贫困者,但这种做法是否恰当,需要深入...
专栏博文“DICOM:基于DCMTK实现C-FIND SCU”中对应的源代码。基于dcmtk开源库中的findscu工程,实现的简单的C-FIND SCU,用于示范如何使用dcmtk操作实现具体的DICOM应用。
/* 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 */ /* ...
**错误信息**: `error C2676: binary ‘>>’: ‘class std::basic_ostream, struct std::char_traits<char>>’ 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 transitioning into pldecal.wad files This code is incomplete... A Majority of the programming has been accomplished.
然而,在实际操作中,我们可能会遇到一个常见的问题,即HTTP状态码406(Not Acceptable)。这个错误通常意味着服务器生成了响应,但客户端无法接受它,因为响应的格式不在其可接受的类型列表中。本篇文章将深入探讨...
文件“ANSI-ASHRAE Standard 62.1-2019 Ventilation for Acceptable Indoor Air Quality - 完整英文版(92页).pdf”提供了标准的全文,包含详细的技术要求、计算方法和实施建议。读者可以通过这份文档深入了解如何...
## 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 components (PV and battery) constrained by a certain acceptable loss of load percentage and by budget. This simulation is written by Stefano ...
【Crawler.zip】是一个包含网络爬虫资源的压缩文件,主要使用Java编程语言实现。网络爬虫,也称为网页蜘蛛或网络机器人,是一种自动化程序,它遍历互联网上的页面,收集信息并存储在数据库中,以便于后续的数据分析...
"django-extra-exceptions"扩展了Django的异常体系,提供了一些新的异常类,如`Http404NotAcceptable`(HTTP 406 Not Acceptable)、`PermissionDenied403`(HTTP 403 Forbidden)、`InvalidToken`(用于处理令牌...
BIOS(基本输入输出系统)是计算机启动时加载的第一个软件,它包含了控制硬件设备和操作系统交互的基本指令。在计算机硬件升级或修复过程中,有时需要对BIOS进行更新或提取特定文件,例如`bios.wph`。...
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, ...
- **406 Not Acceptable**: 找到了资源,但MIME类型与客户端请求不兼容。 - **407 Proxy Authentication Required**: 需要通过代理服务器认证。 - **408 Request Timeout**: 在规定时间内未收到客户端的请求。 - **...
本文将详细介绍20种常见的VC++编译错误信息,并针对每一种错误提供可能的原因及解决办法。 ### 1. 错误 C2065: 'identifier': undeclared identifier - **描述**:当编译器遇到一个未声明的标识符时,会出现此错误...
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 ...
**HTTP 406 Not Acceptable** - **描述**:客户端请求的资源不被服务器所支持,无法用可接受的格式表示。 - **原因**:服务器无法按照客户端的要求返回数据。 - **解决方法**:检查客户端对媒体类型的支持。 ####...
- 406 Not Acceptable:请求不被服务器接受。 - 407 Proxy Authentication Required:需要代理服务器认证。 - 408 Request Timeout:在规定时间内未能找到用户。 - 410 Gone:用户已不存在。 - 413 Request Entity ...
- **406 Not Acceptable**:服务器无法按请求的方式提供资源。 - **407 Proxy Authentication Required**:需通过代理进行身份验证。 - **408 Request Timeout**:请求超时,没有在规定时间内收到完整请求。 - **410...