POST方法給@RequestBody傳參數失敗的解決及原因分析
POST方法給@RequestBody傳參數失敗
通過ajax給springMVC傳遞參數時,通過post方法傳遞json字符串時常用的方式,這時後端應該通過@RequestBody註解配合springMVC中配置的消息轉換器來進行json字符串的解析。
因為post方法中的json字符串通常是一個前端的json對象轉化而成的字符串,所以後端@RequestBody後面可以使用HashMap<String,Object>類型來接收所有參數。
通過這種方式可以非顯式的傳送大量的參數到後端,並且和具體參數無關,便於以後對參數進行擴展,對於不確定參數的場合,這種方式解除瞭與具體參數的耦合。但是由於簡單的過程實際上經歷瞭許多SpringMVC的操作,所以經常會遇到各種奇怪問題。
其中post方法請求體中的json字符串無法成功通過SpringMVC中配置的MessageConverter(一般是MappingJackson2HttpMessageConverter)轉換為@RequestBody註解的HashMap對象,是可以見到的問題。
這個時候你可以檢查下ajax請求的content-type請求頭,因為在配置MessageConverter消息轉換器的時候,需要配置其所檢查的請求體類型(content-type),默認情況下瀏覽器的ajax會添加content-type:application/x-www-form-urlencoded的請求頭,但是有的瀏覽器或者有些時候會發送content-type:application/x-www-form-urlencoded;charset:utf-8到後端,導致MappingJackson2HttpMessageConverter漏過對它的檢查,這個時候SpringMVC會使用其他的MessageConverter來解析request body中的內容,這樣肯定是會解析失敗的。
如果遇到這種情況,比較好的解決方式,可能是在ajax的post請求中強制註明 contentType:application/json,並將application/json 和application/json;charset=utf-8兩種MediaType(MimeType)添加到MappingJackson2HttpMessageConverter對象的檢查列表中。
這樣就可以保證post方法的請求體中的json字符串被MappingJackson2HttpMessageConverter對象檢查並解析。
@RequestBody參數映射不上,@RequestBody報錯
最近代碼遇見瞭一個springmvc中的小問題,算是很基礎的東西,同事問我後我有有些迷惑上網找瞭一些資料後弄清楚瞭。特此記錄一下springmvc註解@requestbody來傳遞參數映射一個對象。
言歸正傳問題是這樣的
使用postMan 發送httppost 請求:
最後報錯。
報錯原因
在使用postMan發送post請求的時候沒有選擇如下:
也就是下面說的需要註意的地方需要註意的地方是:
1.前端做保存操作的時候提交瞭很多參數過來,前端代碼提交的時候content-type改成application/json,後臺也配置瞭一個針對spring4的son類型的httpmessageConverter,
@RequsetBody 綁定的數據類型 :
一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數據。
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然後綁定到相應的bean上。
1,使用@RequestBody 前後端參數要匹配個數不能少。字段名字要一樣。
2,檢查配置文件spring的版本。對應的 spring4 的版本的適配器 對應的:
請用org.springframework.http.converter.json.MappingJacksonHttp2MessageConverter ,選擇的這種配置用的是jackson2.X版本的,用來解析json數據。
spring 3.x的對應的版本:
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
這種配置用的是jackson1.X版本的
3,必須要在請求頭中聲明數據的類型Content-Type,
4,前端json數據和後端json數據 首字母不要大寫,首字母大寫映射不上,以駝峰格式命名。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 使用Spring處理x-www-form-urlencoded方式
- HttpMessageConverter報文信息轉換器的深入講解
- postman模擬post請求的四種請求體
- 聊聊@RequestParam,@PathParam,@PathVariable等註解的區別
- Vue之請求如何傳遞參數