使用Spring MVC 的 @RequestBody 對映json請求引數時報異常問題

to_theend發表於2015-10-28

最近工作中開發RESTful介面需要處理客戶端上傳的json,圖方便想起Spring的Controller中有@RequestBody可以優雅地完成json報文與Java類的對映,但是使用時碰到了 “The request sent by the client was syntactically incorrect.” 異常,記得以前也有碰到過,但是沒有把原因記錄下來,這次又掉坑裡了。又baidugoogle了一會才解決,好記性不如爛筆頭,這次還是好好反省下。


最近工作中開發RESTful介面需要處理客戶端上傳的json,圖方便想起Spring的Controller中有@RequestBody可以優雅地完成json報文與Java類的對映,但是使用時碰到了 “The request sent by the client was syntactically incorrect.” 異常,記得以前也有碰到過,但是沒有把原因記錄下來,這次又掉坑裡了。又baidugoogle了一會才解決,好記性不如爛筆頭,這次還是好好反省下。

異常原因

字面上理解就是“客戶端傳送的請求語法不正確”這種意義不明的異常資訊。語法不正確說的是什麼語法?其實這裡指的是上傳的json報文不符合跟對應Java類的對映關係。舉個栗子: 
比如頁面上Ajax請求的json報文如下:

{"id":1,"name":"zhangsan","gender":1}

Java工程中對應的類定義:


用上述程式碼對映客戶端上傳的json報文就會報“The request sent by the client was syntactically incorrect.”異常。原因很簡單,因為上傳的json報文中有id,name,gender三個欄位,而用來對映的java類中只有id欄位,匹配不了,這就是所謂的“語法不正確”。如果將上述 Person 類的定義改成:


程式再跑起來沒問題了。而且,這裡的Person還可以多定義幾個欄位,即:只要客戶度上傳的json報文欄位都有定義,且型別定義正確,使用@RequestBody對映時就不會報“The request sent by the client was syntactically incorrect.”異常。

總結

在Spring的Controller中使用@RequestBody對映客戶端請求的json報文時,需要注意幾點:

  1. json報文中有的欄位,Java類中也要做定義,且型別必須相同。
  2. Java類中定義的欄位,json報文中可以不出現,到時候對映出來的就是null或者預設值。

相關文章