学习笔记,转自:http://blog.csdn.net/gbtyy/article/details/17165605
Spring 3.2.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.*,不再报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的
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;
- }
看来问题就是出在这里了。不知Spring为何改变该实现方式??!!
解决方法如下:
一、第一种 继续用Spring 3.1.4。
二、第二种
- <?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>
三、第三种
详情见下面的地址点击打开链接
四、第四种
spring 3.2时requestedMediaTypes却为[text/html]的情况报406错误,还有一个原因可能是由于采用的后缀有关,如果使用*.htm,*.html等,默认就会采用[text/html]编码,若改成*.json,*.shtml等就OK
相关推荐
4. **JSON与Ajax**:Spring MVC 3与jQuery或其他JavaScript库配合,可以方便地实现Ajax请求和响应,以JSON形式进行数据交换。 **二、常见错误解决** 1. **406 Not Acceptable**:这个错误通常是因为客户端没有在...
**Spring3 MVC与Ajax结合使用JSON** 在现代Web开发中,Spring框架的MVC模块与Ajax和JSON的集成是创建动态、响应式用户界面的关键技术。这个"Spring3 MVC Ajax with JSON"项目提供了一个Eclipse工程,包含了实现这一...
Struts2.3.7、Spring3.2和Hibernate4.1.8是经典的Java Web开发框架组合,常被称为SSH框架。这个组合为开发者提供了强大的MVC(模型-视图-控制器)架构支持,数据库持久化处理以及依赖注入功能。下面我们将详细探讨这...
通过“spring_mvc_ajax.zip”中的资源,你可以深入学习和实践SpringMVC与Ajax的集成,了解如何创建一个有效的异步数据交互系统。这个压缩包可能包含了相关的Java代码、HTML模板、JavaScript脚本以及配置文件,供你...
### Spring MVC 工作流程详解 #### 一、Spring MVC 的基本概念 Spring MVC 是 Spring 框架的一部分,主要用于构建基于 Java 的 Web 应用程序。它采用 MVC(Model-View-Controller)设计模式,将业务逻辑、数据、...
4. **AJAX支持**:通过jQuery和JSON,Spring 2.5更好地支持了异步请求和响应。 5. **更多注解驱动的开发**:例如,@ModelAttribute用于将请求参数绑定到模型对象,@InitBinder用于初始化数据绑定行为。 至于...
Spring、Hibernate、Spring MVC 和 Ajax 是四个在Java Web开发中广泛应用的技术框架,它们共同构建了一个高效、灵活且功能丰富的后端系统。以下是对这些技术及其整合应用的详细说明: Spring框架是一个全面的企业级...
在Spring MVC中,Jackson是默认的JSON处理器,通过`ObjectMapper`类进行数据转换。Spring MVC还提供了`@JsonView`注解来控制JSON响应中的数据粒度,以及`@JsonProperty`和`@JsonIgnore`来控制哪些字段应包含在JSON中...
**Spring MVC + Ajax 用户登录增删改查功能详解** 在Web开发中,Spring MVC和Ajax是两种非常重要的技术。Spring MVC作为Spring框架的一部分,提供了一种模型-视图-控制器的架构模式,使得开发者能够更好地组织和...
5. **JSON** 数据在服务器与客户端之间传递,可能是Ajax请求的请求体或响应体。 这个DEMO对于初学者来说是一个很好的学习资源,通过实际运行和调试,可以深入理解这些技术如何协同工作,构建一个功能完善的Web应用...
《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...
**Spring3 MVC与Ajax整合详解** 在Web应用开发中,Spring3 MVC框架和Ajax技术的结合使用能够极大地提升用户体验,实现页面的无刷新更新。本文将深入探讨如何在Spring3 MVC项目中集成Ajax,以便更好地理解这两者的...
通过 JSON 或 XML 数据交换,Spring MVC 可以方便地与前端 JavaScript 进行异步交互。 这个"Spring MVC 1 资源文件"可能包含了这些概念的详细解释、实例代码以及配置示例,帮助开发者更好地理解和使用 Spring MVC ...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程调用协议,它使用JSON作为数据交换格式,允许客户端通过HTTP或其他传输协议向服务器发送请求,并获取响应。在Web开发中,JSON-RPC...
4. **Ajax 请求**: Spring MVC 支持处理 JSON、XML 等格式的 Ajax 请求。 5. **多视图控制器**: 一个 Controller 可以处理多个视图。 6. **<mvc:annotation-driven/>**: 自动配置注解处理器,如数据绑定、类型转换等...
在标题和描述中提到的"struts2_spring_json.rar"是一个关于如何在Liferay中利用Struts2和Spring框架处理JSON数据的示例应用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端交互,...
3. **JSON**:JSON作为数据交换格式,其语法简洁,易于阅读和编写,同时也易于机器解析和生成。在前后端交互中,通常由服务器返回JSON格式的数据,前端通过JavaScript解析并渲染到页面上。JSON对象通常包含键值对,...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户交互分离,提高代码的可维护性和可测试性。4.2.4....
在本示例中,“mvc-ajax.rar_spring mvc”是一个包含使用Ajax技术与Spring MVC集成实现账号添加功能的项目。让我们深入探讨这个主题。 首先,Spring MVC是Spring框架的一个组件,专门用于处理Web应用程序的请求和...
正确配置Spring MVC的JSON支持,确保前端和后端的数据类型匹配,是避免406错误的关键。同时,保持库版本的兼容性也是保证程序稳定运行的重要环节。通过这些措施,我们能够顺利地在Spring MVC应用中传递和处理JSON...