SpringMVC 中HttpMessageConverter簡(jiǎn)介和Http請(qǐng)求415 的問(wèn)題
一.問(wèn)題描述:
在SprinvMVC的Web程序中,我在頁(yè)面發(fā)送Ajax 的POST請(qǐng)求,然后在服務(wù)器端利用@requestBody接收請(qǐng)求body中的參數(shù),當(dāng)時(shí)運(yùn)行過(guò)程中,我想服務(wù)器發(fā)送Ajax請(qǐng)求,瀏覽器一直反饋415 Unsupported Media Type或者400的狀態(tài)碼,以為是Ajax寫(xiě)的有問(wèn)題。便查找了半天資料,才發(fā)現(xiàn)spring-mvc.config文件的配置中少了東西,當(dāng)然也有可能是你真的在Ajax中缺少了對(duì)Content-Type參數(shù)的設(shè)置。分析后應(yīng)該是我springMVC-config.xml文件配置有問(wèn)題。
(注):400:(錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語(yǔ)法。 415:(不支持的媒體類型) 請(qǐng)求的格式不受請(qǐng)求頁(yè)面的支持。
二.解決方法:
在springMVC-config.xml文件中,增加了一個(gè)StringHttpMessageConverter請(qǐng)求信息轉(zhuǎn)換器,配置片段如下:
<!--- StringHttpMessageConverter bean --> < bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/> <!-- 啟動(dòng)Spring MVC的注解功能,完成請(qǐng)求和注解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請(qǐng)求信息轉(zhuǎn)換器簡(jiǎn)介:
HttpMessageConverter接口指定了一個(gè)可以把Http request信息和Http response信息進(jìn)行格式轉(zhuǎn)換的轉(zhuǎn)換器。通常實(shí)現(xiàn)HttpMessageConverter接口的轉(zhuǎn)換器有以下幾種:
ByteArrayHttpMessageConverter: 負(fù)責(zé)讀取二進(jìn)制格式的數(shù)據(jù)和寫(xiě)出二進(jìn)制格式的數(shù)據(jù);
StringHttpMessageConverter: 負(fù)責(zé)讀取字符串格式的數(shù)據(jù)和寫(xiě)出二進(jìn)制格式的數(shù)據(jù);
ResourceHttpMessageConverter:負(fù)責(zé)讀取資源文件和寫(xiě)出資源文件數(shù)據(jù);
FormHttpMessageConverter: 負(fù)責(zé)讀取form提交的數(shù)據(jù)(能讀取的數(shù)據(jù)格式為 application/x-www-form-urlencoded,不能讀取multipart/form-data格式數(shù)據(jù));負(fù)責(zé)寫(xiě)入application/x-www-from-urlencoded和multipart/form-data格式的數(shù)據(jù);
MappingJacksonHttpMessageConverter: 負(fù)責(zé)讀取和寫(xiě)入json格式的數(shù)據(jù);
SourceHttpMessageConverter: 負(fù)責(zé)讀取和寫(xiě)入 xml 中javax.xml.transform.Source定義的數(shù)據(jù);
Jaxb2RootElementHttpMessageConverter: 負(fù)責(zé)讀取和寫(xiě)入xml 標(biāo)簽格式的數(shù)據(jù);
AtomFeedHttpMessageConverter: 負(fù)責(zé)讀取和寫(xiě)入Atom格式的數(shù)據(jù);
RssChannelHttpMessageConverter: 負(fù)責(zé)讀取和寫(xiě)入RSS格式的數(shù)據(jù);
更多關(guān)于HttpMessageConverter的信息請(qǐng)看:
http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/http/converter/HttpMessageConverter.html
四.HttpMessageConverter請(qǐng)求信息轉(zhuǎn)換器執(zhí)行流程:
當(dāng)用戶發(fā)送請(qǐng)求后,@Requestbody 注解會(huì)讀取請(qǐng)求body中的數(shù)據(jù),默認(rèn)的請(qǐng)求轉(zhuǎn)換器HttpMessageConverter通過(guò)獲取請(qǐng)求頭Header中的Content-Type來(lái)確認(rèn)請(qǐng)求頭的數(shù)據(jù)格式,從而來(lái)為請(qǐng)求數(shù)據(jù)適配合適的轉(zhuǎn)換器。例如contentType:applicatin/json,那么轉(zhuǎn)換器會(huì)適配MappingJacksonHttpMessageConverter。響應(yīng)時(shí)候的時(shí)候同理,@Responsebody注解會(huì)啟用HttpMessageConverter,通過(guò)檢測(cè)Header中Accept屬性來(lái)適配的響應(yīng)的轉(zhuǎn)換器。
總結(jié):
當(dāng)在使用SpringMVC做服務(wù)器數(shù)據(jù)接收時(shí),尤其是在做Ajax請(qǐng)求的時(shí)候,尤其要注意contentType屬性,和accepte 屬性的設(shè)置,在springmvc-config.xml中配置好相應(yīng)的轉(zhuǎn)換器。當(dāng)我們?cè)谟肧pringMVC做 Ajax 請(qǐng)求的時(shí)候,有的做法用response.getWriter().print()的方法,還有更好的方法就是添加@Responsebody注解,直接返回Map類型的數(shù)據(jù),轉(zhuǎn)換器自動(dòng)轉(zhuǎn)換為JSON數(shù)據(jù)類型。
- SpringMVC配置javaConfig及StringHttpMessageConverter示例
- SpringMVC HttpMessageConverter消息轉(zhuǎn)換器
- SpringMVC HttpMessageConverter報(bào)文信息轉(zhuǎn)換器
- SpringMVC?HttpMessageConverter報(bào)文信息轉(zhuǎn)換器
- springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解
- SpringMVC源碼解析之消息轉(zhuǎn)換器HttpMessageConverter
- springMVC中HttpMessageConverter的具體使用
相關(guān)文章
Spring Boot實(shí)現(xiàn)分布式鎖的自動(dòng)釋放的示例代碼
在實(shí)際開(kāi)發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統(tǒng)來(lái)實(shí)現(xiàn)分布式鎖,本文將介紹如何使用 Spring Boot 來(lái)實(shí)現(xiàn)分布式鎖的自動(dòng)釋放,感興趣的朋友跟隨小編一起看看吧2023-06-06JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot中的@EnableConfigurationProperties注解原理及用法
在SpringBoot中,@EnableConfigurationProperties注解是一個(gè)非常有用的注解,它可以用于啟用對(duì)特定配置類的支持,在本文中,我們將深入探討@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以參考下2023-06-06Python文件高級(jí)操作函數(shù)之文件信息獲取與目錄操作
這篇文章主要介紹了Python文件高級(jí)操作函數(shù)之文件信息獲取與目錄操作,在Python中,內(nèi)置了文件(File)對(duì)象。在使用文件對(duì)象時(shí),首先需要通過(guò)內(nèi)置的open()方法創(chuàng)建一個(gè)文件對(duì)象,然后通過(guò)該對(duì)象提供的方法進(jìn)行一些基本文件操作,需要的朋友可以參考下2023-05-05Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10