SpringMVC 中HttpMessageConverter简介和Http请求415 的问题

 更新时间:2016年07月07日 09:59:01   投稿:lqh  
本文介绍且记录如何解决在SpringMVC 中遇到415 Unsupported Media Type 的问题,并且顺便介绍Spring MVC的HTTP请求信息转换器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请求信息转换器,配置片段如下:

<!--- StringHttpMessageConverter bean -->
< bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/>
 
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
 < property name= "messageConverters" >
 < list>
  < ref bean= "mappingJacksonHttpMessageConverter" />
  <!-- 新增的StringMessageConverter bean-->
  < 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数据类型。

相关文章

  • Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    下面小编就为大家带来一篇Python单元测试_使用装饰器实现测试跳过和预期故障的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring Boot 使用WebAsyncTask异步返回结果

    Spring Boot 使用WebAsyncTask异步返回结果

    这篇文章主要介绍了Spring Boot 使用WebAsyncTask异步返回结果的相关资料,需要的朋友可以参考下
    2018-02-02
  • Java 实现并发的几种方式小结

    Java 实现并发的几种方式小结

    这篇文章主要介绍了Java 实现并发的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Spring Boot如何使用HikariCP连接池详解

    Spring Boot如何使用HikariCP连接池详解

    这篇文章主要给大家介绍了关于Spring Boot如何使用HikariCP连接池的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用springboot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Java TimedCache 带时间缓存工具类详解使用

    Java TimedCache 带时间缓存工具类详解使用

    工具类是包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期工具等各类常用工具包,本文将介绍带时间缓存工具类
    2021-10-10
  • java实现平面山脉模型

    java实现平面山脉模型

    这篇文章主要为大家详细介绍了java实现平面山脉模型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Spring Cloud中Sentinel的两种限流模式介绍

    Spring Cloud中Sentinel的两种限流模式介绍

    如何使用Sentinel做流量控制呢?这篇文章就来为大家详细介绍了Spring Cloud中Sentinel的两种限流模式,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • 浅析Java如何优雅的设计接口状态码和异常

    浅析Java如何优雅的设计接口状态码和异常

    HTTP协议里定义了一系列的状态码用来表明请求的状态,如常用的200表示请求正常,404表示请求的资源不存在,所以本文就来和大家讨论一下如何优雅的设计接口状态码和异常,感兴趣的可以了解下
    2024-03-03
  • SpringBoot整合Ehcache3的实现步骤

    SpringBoot整合Ehcache3的实现步骤

    本文主要介绍了SpringBoot整合Ehcache3的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Spring Boot开发RESTful接口与http协议状态表述

    Spring Boot开发RESTful接口与http协议状态表述

    这篇文章主要为大家介绍了Spring Boot开发RESTful接口与http协议状态表述,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03

最新评论