SpringMVC 中HttpMessageConverter简介和Http请求415 Unsupported Media Type的问题 对比项目用的

本文介绍如何解决在SpringMVC中遇到的415 UnsupportedMediaType问题,并详细解释SpringMVC的HTTP请求信息转换器HttpMessageConverter。包括在配置文件中增加StringHttpMessageConverter解决请求体类型不匹配问题,以及HTTP消息转换器的种类和执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.2cto.com/kf/201312/262557.html

转载于上面,并自己做了一些记录,关于支持Spring新版本的Converter和Adapter

一、概述:

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

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

------------------------------------------------------------------------------------
注:在Spring 3.2之后不建议用AnnotationMethodHandlerAdapter了,建议用 RequestMappingHandlerAdapter代替它
并且MappingJacksonHttpMessageConverter也不建议用了,建议用 MappingJackson2HttpMessageConverter代替它
所以下面说的一些 convter可能有一些已经不建议用,需要用相应的新的 convter在spring里
---------------------------------------------------------〉
比如像下面这样:
<!-- enable mvc annotations -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json. MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
     // The Class CustomJacksonObjectMapper is responsible for overriding Date output and emitting ISO standard dates
     // 负责重写 Date output 并且输出 ISO标准的date
public class CustomJacksonObjectMapper extends ObjectMapper
<bean id="jacksonObjectMapper" class="xxx.xxx.xxx.CustomJacksonObjectMapper" />

<bean class="org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerAdapter" />

我理解是比如,你想支持 json到httpmessage的转换,那么就添加MappingJackson2HttpMessageConverter的转换器,如果你还想支持其它类型的转换器,比如像在spring3.2之前的配置那样,只需要在这里再加一个类似stringHttpMessageConverter(新版本Spring支持的)的转换器,则Spring就会通过RequestMappingHandlerAdapter 知道你想支持这样的转换从前台到后台或者从后台到前台。
我认为是 RequestMappingHandlerAdapter 能自动探测到你配置到<mvc:message-converters>里的转换器,而不必在这个配置文件里显示的去指定他们之间的关联关系。
注解式处理器适配器会通过 反射调用相应的功能处理方法(方法上拥有@RequestMapping注解)
---------------------------------------------------------〉

四、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数据类型


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值