SpringMVC 中HttpMessageConverter简介

简介:

一.问题描述:
在SprinvMVC的Web程序中,我在页面发送Ajax 的POST请求,然后在服务器端利用@requestBody接收请求body中的参数,当时运行过程中,我想服务器发送Ajax请求,浏览器一直反馈415 Unsupported Media Type或者400的状态码,以为是Ajax写的有问题。便查找了半天资料,才发现spring-mvc.config文件的配置中少了东西,当然也有可能是你真的在Ajax中缺少了对Content-Type参数的设置。分析后应该是我springMVC-config.xml文件配置有问题。
(注):400:(错误请求) 服务器不理解请求的语法。 415:(不支持的媒体类型) 请求的格式不受请求页面的支持。
二.解决方法: 
 在springMVC-config.xml文件中,增加了一个StringHttpMessageConverter请求信息转换器,配置片段如下:


< bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/>


< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
< property name= "messageConverters" >
< list>
< ref bean= "mappingJacksonHttpMessageConverter" />

< ref bean= "stringHttpMessageConverter" />
< ref bean= "jsonHttpMessageConverter" />
< ref bean= "formHttpMessageConverter" />
list>
property>
bean>

三.HttpMessageConverter请求信息转换器简介:
HttpMessageConverter接口指定了一个可以把Http request信息和Http response信息进行格式转换的转换器。通常实现HttpMessageConverter接口的转换器有以下几种:
ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
StringHttpMessageConverter: 负责读取字符串格式的数据和写出二进制格式的数据;
ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
FormHttpMessageConverter: 负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;
SourceHttpMessageConverter: 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
Jaxb2RootElementHttpMessageConverter: 负责读取和写入xml 标签格式的数据;
AtomFeedHttpMessageConverter: 负责读取和写入Atom格式的数据;
RssChannelHttpMessageConverter: 负责读取和写入RSS格式的数据;
更多关于HttpMessageConverter的信息请看:
http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/http/converter/HttpMessageConverter.html
四.HttpMessageConverter请求信息转换器执行流程:
当用户发送请求后,@Requestbody 注解会读取请求body中的数据,默认的请求转换器HttpMessageConverter通过获取请求头Header中的Content-Type来确认请求头的数据格式,从而来为请求数据适配合适的转换器。例如contentType:applicatin/json,那么转换器会适配MappingJacksonHttpMessageConverter。响应时候的时候同理,@Responsebody注解会启用HttpMessageConverter,通过检测Header中Accept属性来适配的响应的转换器。

总结:
当在使用SpringMVC做服务器数据接收时,尤其是在做Ajax请求的时候,尤其要注意contentType属性,和accepte 属性的设置,在springmvc-config.xml中配置好相应的转换器。当我们在用SpringMVC做 Ajax 请求的时候,有的做法用response.getWriter().print()的方法,还有更好的方法就是添加@Responsebody注解,直接返回Map类型的数据,转换器自动转换为JSON数据类型。

转自:http://www.jb51.net/article/88091.htm

相关文章
|
存储 缓存 Linux
Linux内核学习(九):linux内核的特殊文件系统-debugfs、ftrace、sys
Linux内核学习(九):linux内核的特殊文件系统-debugfs、ftrace、sys
513 0
|
负载均衡 前端开发 Java
Spring Cloud Feign(声明式服务调用)使用指南
Spring Cloud Feign(声明式服务调用)使用指南
4890 0
Spring Cloud Feign(声明式服务调用)使用指南
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
740 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
算法 网络架构
计算机网络: 点对点协议 PPP
计算机网络: 点对点协议 PPP
313 0
|
Java Maven
intellij idea如何查看项目maven依赖关系图
这篇文章介绍了如何在IntelliJ IDEA中查看项目的Maven依赖关系图,包括使用Maven工具栏和相关操作来展示和查看依赖细节。
|
算法 安全 Linux
Ansible 中的copy 复制模块应用详解
Ansible 中的copy 复制模块应用详解
794 1
|
机器学习/深度学习 算法 搜索推荐
23年9月发表,工作量叠满:线粒体+PCD+多组学+机器学习+泛癌
**摘要:** 一项发表在《Journal of Translational Medicine》(IF=7.4)的研究聚焦于低级别胶质瘤(LGG),通过集成机器学习分析线粒体功能与18种细胞死亡模式的交互,开发了一种名为mtPCDI的预后指数。该模型基于1467例全球多中心LGG患者的基因表达数据,揭示了线粒体功能与预后及免疫代谢特征的关联。mtPCDI高分组表现出代谢途径增强和免疫活性,且在调整混杂因素后,其预后价值超过传统临床模型。研究结果强调mtPCDI在个性化风险评估和治疗策略制定中的潜力,并为线粒体介导的细胞死亡研究提供了新视角。
399 1
|
存储 设计模式 缓存
Nacos 服务端注册、客户端服务发现源码分析(二)
Nacos 服务端注册、客户端服务发现源码分析(二)
564 1
|
Cloud Native 定位技术 Docker
云原生之使用docker部署NTP时间服务器
云原生之使用docker部署NTP时间服务器
1305 0
云原生之使用docker部署NTP时间服务器
|
前端开发 JavaScript 关系型数据库
微搭低代码从入门到精通02数据源的介绍
微搭低代码从入门到精通02数据源的介绍