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物件檢查並解析。