解決SpringMVC使用@RequestBody注解報400錯誤的問題
一般使用@RequestBody接收的時候報400都是傳入的json字符串和對應封裝的對象不對應造成的
首先要注意
封裝的對象中的字段類型有沒有Date類型或者int等類型的,如果有的話,在set方法中統(tǒng)一將傳入的參數(shù)要調(diào)整為String類型
在set方法中進行參數(shù)的轉(zhuǎn)換
比如有一個Date類型的字段
private Date startTime;
public Date getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
// 這里根據(jù)你的時間格式選擇
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
this.startTime = dateFormat.parse(startTime);
} catch (ParseException e) {
this.startTime = null;
}
}
這樣寫就可以了,不要將形參的類型寫成Date類型,所以這里建議對實體類構(gòu)建一個DTO,使用DTO進行封裝
前臺的ajax發(fā)送如下:
$.ajax({
type : "POST",
contentType : "application/json",
url : xxxxx,// 請求路徑
data : JSON.stringify(data),// 將data的JSON對象轉(zhuǎn)換為字符串{name:'value'}的格式
success : function(msg) {
},
error : function() {
}
});
后臺的接受方法很簡單
@RequestMapping(value = "XXXXX.do", method = RequestMethod.POST)
@ResponseBody
public String saveInstCorNotice(@RequestBody EntityDTO entityDTO) {
}
以前總被坑,這里記錄一下!
補充知識:SpringMVC在攔截器中做權(quán)限控制,解決RequestBody獲取問題
做接口的權(quán)限控制,接口請求結(jié)構(gòu)是JSON串,比較為難的是@RequestBody的獲取
網(wǎng)上的資料是先手動讀出來,再使用自定義的封裝將JSON串寫回去
感覺有點麻煩,使用了新的思路
在攔截器中,攔截需要做權(quán)限驗證的請求,使用下面的方式,將權(quán)限校驗跳轉(zhuǎn)到Controller層中做
String uri = request.getRequestURI();
request.setAttribute("referenceUrl", uri);
request.getRequestDispatcher(checkerUrl).forward(request, response);
url是用來校驗權(quán)限的Controller路徑
在Controller中可以使用@RequestBody注解拿到請求body,
之后可以使用獲取到的body信息校驗權(quán)限,
校驗通過的,獲取uri
再次通過如下方式,跳轉(zhuǎn)到真正要請求的Controller層
request.getRequestDispatcher(uri).forward(request, response);
注意,這里會有攔截器死循環(huán)的問題,當然 因為@RequestBody只能讀一次的特性,在第二次被攔截器攔截時就會因為請求Body為空拋異常。再當然 如果你不幸的設置了@RequestBody注解required屬性為false,即允許為空 那么就真的陷入無限循環(huán)了
所以,這里我們要給request加一個標志,表明經(jīng)過了該過濾器,一旦標志不為空則直接返回true 允許請求通過
if (null != flag) {
return true;
}
/*
*我想你不會將上面的代碼寫到攔截器后面的對吧
*
*一定要將上面的代碼加到攔截器一開始的地方
*也不要忘記 后續(xù)設置標志位的代碼
*/
解決了上面的問題可能會有請求兩次的問題,這是因為將權(quán)限校驗跳轉(zhuǎn)到Controller層后需要
return false
否則你會發(fā)現(xiàn)請求執(zhí)行了兩次,并且在第二次拋異常:writer已經(jīng)調(diào)用過
當然,這里還有一個問題,那就是權(quán)限校驗的Controller層已經(jīng)讀取了RequestBody,那么 真正的業(yè)務邏輯Controller層怎么獲取呢?
在通過校驗后,將獲取到RequestBody放到Request的Attribute中
在業(yè)務邏輯Controller層使用@RequestAttribute注解獲取
以上這篇解決SpringMVC使用@RequestBody注解報400錯誤的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

