`

Spring 3.2.* MVC通过Ajax获取JSON数据报406错误

 
阅读更多

学习笔记,转自: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),在以下代码处抛出了异常:

 

[java] view plaincopy
  1. if (compatibleMediaTypes.isEmpty()) {  
  2.         throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes);  
  3.     }  

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

3.1的

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private List<MediaType> getAcceptableMediaTypes(HttpInputMessage inputMessage) {  
  2.         try {  
  3.             List<MediaType> result = inputMessage.getHeaders().getAccept();  
  4.             return result.isEmpty() ? Collections.singletonList(MediaType.ALL) : result;  
  5.         } catch (IllegalArgumentException ex) {  
  6.             if (logger.isDebugEnabled()) {  
  7.                 logger.debug("Could not parse Accept header: " + ex.getMessage());  
  8.             }  
  9.             return Collections.emptyList();  
  10.         }  
  11.     }  

3.2的

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private List<MediaType> getAcceptableMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException {  
  2.         List<MediaType> mediaTypes = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request));  
  3.         return mediaTypes.isEmpty() ? Collections.singletonList(MediaType.ALL) : mediaTypes;  
  4.     }  

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

 

解决方法如下:

一、第一种 继续用Spring 3.1.4。

二、第二种

 

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.        
  7.         xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.              http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  9.              http://www.springframework.org/schema/context  
  10.              http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  11.              http://www.springframework.org/schema/aop  
  12.              http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  13.              http://www.springframework.org/schema/tx   
  14.              http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  15.              http://www.springframework.org/schema/mvc    
  16.              http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  

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

 

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.   
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  9.          http://www.springframework.org/schema/context  
  10.          http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  11.          http://www.springframework.org/schema/aop  
  12.          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  13.          http://www.springframework.org/schema/tx   
  14.          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  15.         http://www.springframework.org/schema/mvc   
  16.         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">  

 

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

 

[html] view plaincopy
  1. <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />   
  2. <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">   
  3.     <property name="favorPathExtension" value="false" />  
  4.     <property name="favorParameter" value="false" />   
  5.     <property name="ignoreAcceptHeader" value="false" />   
  6.     <property name="mediaTypes" >   
  7.         <value>  
  8.             atom=application/atom+xml  
  9.             html=text/html  
  10.             json=application/json  
  11.             *=*/*  
  12.         </value>   
  13.     </property>  
  14. </bean>  

三、第三种

 

详情见下面的地址点击打开链接

四、第四种

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

分享到:
评论

相关推荐

    四. Spring MVC 3 支持json及 常见错误解决

    4. **JSON与Ajax**:Spring MVC 3与jQuery或其他JavaScript库配合,可以方便地实现Ajax请求和响应,以JSON形式进行数据交换。 **二、常见错误解决** 1. **406 Not Acceptable**:这个错误通常是因为客户端没有在...

    Spring3 MVC Ajax with JSON

    **Spring3 MVC与Ajax结合使用JSON** 在现代Web开发中,Spring框架的MVC模块与Ajax和JSON的集成是创建动态、响应式用户界面的关键技术。这个"Spring3 MVC Ajax with JSON"项目提供了一个Eclipse工程,包含了实现这一...

    Struts2.3.7+Spring3.2+Hibrenate4.1.8

    Struts2.3.7、Spring3.2和Hibernate4.1.8是经典的Java Web开发框架组合,常被称为SSH框架。这个组合为开发者提供了强大的MVC(模型-视图-控制器)架构支持,数据库持久化处理以及依赖注入功能。下面我们将详细探讨这...

    spring_mvc_ajax.zip_SpringMVC ajax_SpringMVC+ajax_spring ajax_sp

    通过“spring_mvc_ajax.zip”中的资源,你可以深入学习和实践SpringMVC与Ajax的集成,了解如何创建一个有效的异步数据交互系统。这个压缩包可能包含了相关的Java代码、HTML模板、JavaScript脚本以及配置文件,供你...

    spring-mvc.docx

    ### Spring MVC 工作流程详解 #### 一、Spring MVC 的基本概念 Spring MVC 是 Spring 框架的一部分,主要用于构建基于 Java 的 Web 应用程序。它采用 MVC(Model-View-Controller)设计模式,将业务逻辑、数据、...

    spring2.0MVC+spring2.5MVC+portletMVC

    4. **AJAX支持**:通过jQuery和JSON,Spring 2.5更好地支持了异步请求和响应。 5. **更多注解驱动的开发**:例如,@ModelAttribute用于将请求参数绑定到模型对象,@InitBinder用于初始化数据绑定行为。 至于...

    Spring + Hibernate + Spring mvc +Ajax 整合

    Spring、Hibernate、Spring MVC 和 Ajax 是四个在Java Web开发中广泛应用的技术框架,它们共同构建了一个高效、灵活且功能丰富的后端系统。以下是对这些技术及其整合应用的详细说明: Spring框架是一个全面的企业级...

    spring mvc json&&jackson jquery js

    在Spring MVC中,Jackson是默认的JSON处理器,通过`ObjectMapper`类进行数据转换。Spring MVC还提供了`@JsonView`注解来控制JSON响应中的数据粒度,以及`@JsonProperty`和`@JsonIgnore`来控制哪些字段应包含在JSON中...

    Spring mvc+Ajax用户登录增删改查功能

    **Spring MVC + Ajax 用户登录增删改查功能详解** 在Web开发中,Spring MVC和Ajax是两种非常重要的技术。Spring MVC作为Spring框架的一部分,提供了一种模型-视图-控制器的架构模式,使得开发者能够更好地组织和...

    springmvc spring hibernate ajax json

    5. **JSON** 数据在服务器与客户端之间传递,可能是Ajax请求的请求体或响应体。 这个DEMO对于初学者来说是一个很好的学习资源,通过实际运行和调试,可以深入理解这些技术如何协同工作,构建一个功能完善的Web应用...

    Spring MVC Cookbook(PACKT,2016).pdf

    《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...

    Spring3MVC+ajax

    **Spring3 MVC与Ajax整合详解** 在Web应用开发中,Spring3 MVC框架和Ajax技术的结合使用能够极大地提升用户体验,实现页面的无刷新更新。本文将深入探讨如何在Spring3 MVC项目中集成Ajax,以便更好地理解这两者的...

    Spring MVC 1 资源文件

    通过 JSON 或 XML 数据交换,Spring MVC 可以方便地与前端 JavaScript 进行异步交互。 这个"Spring MVC 1 资源文件"可能包含了这些概念的详细解释、实例代码以及配置示例,帮助开发者更好地理解和使用 Spring MVC ...

    Json-RPC & Spring MVC 集成

    JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程调用协议,它使用JSON作为数据交换格式,允许客户端通过HTTP或其他传输协议向服务器发送请求,并获取响应。在Web开发中,JSON-RPC...

    Spring_MVC_教程_快速入门_深入分析

    4. **Ajax 请求**: Spring MVC 支持处理 JSON、XML 等格式的 Ajax 请求。 5. **多视图控制器**: 一个 Controller 可以处理多个视图。 6. **&lt;mvc:annotation-driven/&gt;**: 自动配置注解处理器,如数据绑定、类型转换等...

    struts2_spring_json.rar_liferay struts2 json_portlet json_spring

    在标题和描述中提到的"struts2_spring_json.rar"是一个关于如何在Liferay中利用Struts2和Spring框架处理JSON数据的示例应用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端交互,...

    spring+mybatis框架,json,ajax学习demo代码

    3. **JSON**:JSON作为数据交换格式,其语法简洁,易于阅读和编写,同时也易于机器解析和生成。在前后端交互中,通常由服务器返回JSON格式的数据,前端通过JavaScript解析并渲染到页面上。JSON对象通常包含键值对,...

    Spring MVC 4.2.4.RELEASE 中文文档

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户交互分离,提高代码的可维护性和可测试性。4.2.4....

    mvc-ajax.rar_spring mvc

    在本示例中,“mvc-ajax.rar_spring mvc”是一个包含使用Ajax技术与Spring MVC集成实现账号添加功能的项目。让我们深入探讨这个主题。 首先,Spring MVC是Spring框架的一个组件,专门用于处理Web应用程序的请求和...

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

    正确配置Spring MVC的JSON支持,确保前端和后端的数据类型匹配,是避免406错误的关键。同时,保持库版本的兼容性也是保证程序稳定运行的重要环节。通过这些措施,我们能够顺利地在Spring MVC应用中传递和处理JSON...

Global site tag (gtag.js) - Google Analytics