1. 程式人生 > 程式設計 >解決SpringMVC使用@RequestBody註解報400錯誤的問題

解決SpringMVC使用@RequestBody註解報400錯誤的問題

一般使用@RequestBody接收的時候報400都是傳入的json字串和對應封裝的物件不對應造成的

首先要注意

封裝的物件中的欄位型別有沒有Date型別或者int等型別的,如果有的話,在set方法中統一將傳入的引數要調整為String型別

在set方法中進行引數的轉換

比如有一個Date型別的欄位

 private Date startTime;
 
 public Date getStartTime() {
 return startTime;
 }
 public void setStartTime(String startTime) {
 // 這裡根據你的時間格式選擇
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 try {
  this.startTime = dateFormat.parse(startTime);
 } catch (ParseException e) {
  this.startTime = null;
 }
 }

這樣寫就可以了,不要將形參的型別寫成Date型別,所以這裡建議對實體類構建一個DTO,使用DTO進行封裝

前臺的ajax傳送如下:

$.ajax({
 type : "POST",contentType : "application/json",url : xxxxx,// 請求路徑
 data : JSON.stringify(data),// 將data的JSON物件轉換為字串{name:'value'}的格式
 success : function(msg) {
 },error : function() {
 }
});

後臺的接受方法很簡單

 @RequestMapping(value = "XXXXX.do",method = RequestMethod.POST)
 @ResponseBody
 public String saveInstCorNotice(@RequestBody EntityDTO entityDTO) {
 
 }

以前總被坑,這裡記錄一下!

補充知識:SpringMVC在攔截器中做許可權控制,解決RequestBody獲取問題

做介面的許可權控制,介面請求結構是JSON串,比較為難的是@RequestBody的獲取

網上的資料是先手動讀出來,再使用自定義的封裝將JSON串寫回去

感覺有點麻煩,使用了新的思路

在攔截器中,攔截需要做許可權驗證的請求,使用下面的方式,將許可權校驗跳轉到Controller層中做

String uri = request.getRequestURI();
request.setAttribute("referenceUrl",uri);
request.getRequestDispatcher(checkerUrl).forward(request,response);

url是用來校驗許可權的Controller路徑

在Controller中可以使用@RequestBody註解拿到請求body,

之後可以使用獲取到的body資訊校驗許可權,

校驗通過的,獲取uri

再次通過如下方式,跳轉到真正要請求的Controller層

request.getRequestDispatcher(uri).forward(request,response);

注意,這裡會有攔截器死迴圈的問題,當然 因為@RequestBody只能讀一次的特性,在第二次被攔截器攔截時就會因為請求Body為空拋異常。再當然 如果你不幸的設定了@RequestBody註解required屬性為false,即允許為空 那麼就真的陷入無限迴圈了

所以,這裡我們要給request加一個標誌,表明經過了該過濾器,一旦標誌不為空則直接返回true 允許請求通過

if (null != flag) {
 return true;
}
/*
 *我想你不會將上面的程式碼寫到攔截器後面的對吧
 *
 *一定要將上面的程式碼加到攔截器一開始的地方
 *也不要忘記 後續設定標誌位的程式碼
*/

解決了上面的問題可能會有請求兩次的問題,這是因為將許可權校驗跳轉到Controller層後需要

return false

否則你會發現請求執行了兩次,並且在第二次拋異常:writer已經呼叫過

當然,這裡還有一個問題,那就是許可權校驗的Controller層已經讀取了RequestBody,那麼 真正的業務邏輯Controller層怎麼獲取呢?

在通過校驗後,將獲取到RequestBody放到Request的Attribute中

在業務邏輯Controller層使用@RequestAttribute註解獲取

以上這篇解決SpringMVC使用@RequestBody註解報400錯誤的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。