POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
POST方法給@RequestBody傳參數(shù)失敗
通過(guò)ajax給springMVC傳遞參數(shù)時(shí),通過(guò)post方法傳遞json字符串時(shí)常用的方式,這時(shí)后端應(yīng)該通過(guò)@RequestBody注解配合springMVC中配置的消息轉(zhuǎn)換器來(lái)進(jìn)行json字符串的解析。
因?yàn)閜ost方法中的json字符串通常是一個(gè)前端的json對(duì)象轉(zhuǎn)化而成的字符串,所以后端@RequestBody后面可以使用HashMap<String,Object>類型來(lái)接收所有參數(shù)。
通過(guò)這種方式可以非顯式的傳送大量的參數(shù)到后端,并且和具體參數(shù)無(wú)關(guān),便于以后對(duì)參數(shù)進(jìn)行擴(kuò)展,對(duì)于不確定參數(shù)的場(chǎng)合,這種方式解除了與具體參數(shù)的耦合。但是由于簡(jiǎn)單的過(guò)程實(shí)際上經(jīng)歷了許多SpringMVC的操作,所以經(jīng)常會(huì)遇到各種奇怪問(wèn)題。
其中post方法請(qǐng)求體中的json字符串無(wú)法成功通過(guò)SpringMVC中配置的MessageConverter(一般是MappingJackson2HttpMessageConverter)轉(zhuǎn)換為@RequestBody注解的HashMap對(duì)象,是可以見(jiàn)到的問(wèn)題。
這個(gè)時(shí)候你可以檢查下ajax請(qǐng)求的content-type請(qǐng)求頭,因?yàn)樵谂渲肕essageConverter消息轉(zhuǎn)換器的時(shí)候,需要配置其所檢查的請(qǐng)求體類型(content-type),默認(rèn)情況下瀏覽器的ajax會(huì)添加content-type:application/x-www-form-urlencoded的請(qǐng)求頭,但是有的瀏覽器或者有些時(shí)候會(huì)發(fā)送content-type:application/x-www-form-urlencoded;charset:utf-8到后端,導(dǎo)致MappingJackson2HttpMessageConverter漏過(guò)對(duì)它的檢查,這個(gè)時(shí)候SpringMVC會(huì)使用其他的MessageConverter來(lái)解析request body中的內(nèi)容,這樣肯定是會(huì)解析失敗的。
如果遇到這種情況,比較好的解決方式,可能是在ajax的post請(qǐng)求中強(qiáng)制注明 contentType:application/json,并將application/json 和application/json;charset=utf-8兩種MediaType(MimeType)添加到MappingJackson2HttpMessageConverter對(duì)象的檢查列表中。
這樣就可以保證post方法的請(qǐng)求體中的json字符串被MappingJackson2HttpMessageConverter對(duì)象檢查并解析。
@RequestBody參數(shù)映射不上,@RequestBody報(bào)錯(cuò)
最近代碼遇見(jiàn)了一個(gè)springmvc中的小問(wèn)題,算是很基礎(chǔ)的東西,同事問(wèn)我后我有有些迷惑上網(wǎng)找了一些資料后弄清楚了。特此記錄一下springmvc注解@requestbody來(lái)傳遞參數(shù)映射一個(gè)對(duì)象。

言歸正傳問(wèn)題是這樣的
使用postMan 發(fā)送httppost 請(qǐng)求:

最后報(bào)錯(cuò)。
報(bào)錯(cuò)原因
在使用postMan發(fā)送post請(qǐng)求的時(shí)候沒(méi)有選擇如下:

也就是下面說(shuō)的需要注意的地方需要注意的地方是:
1.前端做保存操作的時(shí)候提交了很多參數(shù)過(guò)來(lái),前端代碼提交的時(shí)候content-type改成application/json,后臺(tái)也配置了一個(gè)針對(duì)spring4的son類型的httpmessageConverter,
@RequsetBody 綁定的數(shù)據(jù)類型 :
一般用來(lái)處理非Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù)。
GET請(qǐng)求中,因?yàn)闆](méi)有HttpEntity,所以@RequestBody并不適用。POST請(qǐng)求中,通過(guò)HttpEntity傳遞的參數(shù),必須要在請(qǐng)求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過(guò)使用HandlerAdapter 配置的HttpMessageConverters來(lái)解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。
1,使用@RequestBody 前后端參數(shù)要匹配個(gè)數(shù)不能少。字段名字要一樣。
2,檢查配置文件spring的版本。對(duì)應(yīng)的 spring4 的版本的適配器 對(duì)應(yīng)的:
請(qǐng)用org.springframework.http.converter.json.MappingJacksonHttp2MessageConverter ,選擇的這種配置用的是jackson2.X版本的,用來(lái)解析json數(shù)據(jù)。

spring 3.x的對(duì)應(yīng)的版本:
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
這種配置用的是jackson1.X版本的
3,必須要在請(qǐng)求頭中聲明數(shù)據(jù)的類型Content-Type,
4,前端json數(shù)據(jù)和后端json數(shù)據(jù) 首字母不要大寫,首字母大寫映射不上,以駝峰格式命名。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot結(jié)成MyBatis-Plus最全配置指南
本文主要介紹了Spring Boot結(jié)成MyBatis-Plus最全配置指南,包括依賴引入、配置數(shù)據(jù)源、Mapper 掃描、基本CRUD操作等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
spring+maven實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了spring+maven實(shí)現(xiàn)發(fā)送郵件功能,利用spring提供的郵件工具來(lái)發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
詳解Java的readBytes是怎么實(shí)現(xiàn)的
眾所周知,Java是一門跨平臺(tái)語(yǔ)言,針對(duì)不同的操作系統(tǒng)有不同的實(shí)現(xiàn),下面小編就來(lái)從一個(gè)非常簡(jiǎn)單的api調(diào)用帶大家來(lái)看看Java具體是怎么做的吧2023-07-07
springboot @RequiredArgsConstructor的概念與使用方式
這篇文章主要介紹了springboot @RequiredArgsConstructor的概念與使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
SpringBoot項(xiàng)目中讀取resource目錄下的文件六種方法
這篇文章給大家總結(jié)了SpringBoot項(xiàng)目中讀取resource目錄下的文件六種方法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-05-05
MyBatis批量插入/修改/刪除MySql數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于MyBatis批量插入/修改/刪除MySql數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Java多線程導(dǎo)致CPU占用100%解決及線程池正確關(guān)閉方式
1000萬(wàn)表數(shù)據(jù)導(dǎo)入內(nèi)存數(shù)據(jù)庫(kù),按分頁(yè)大小10000查詢,多線程,15條線程跑,最后發(fā)現(xiàn)CPU占用100%卡死,那么如何解決,本文就來(lái)介紹一下,感興趣的朋友可以了解一下2021-05-05
淺析Java的Spring框架中IOC容器容器的應(yīng)用
這篇文章主要介紹了Java的Spring框架中IOC容器容器的應(yīng)用,包括BeanFactory容器和ApplicationContext容器的介紹,需要的朋友可以參考下2015-12-12

