1. 程式人生 > >post 400 (Bad Request)異常怎麼排查引數問題

post 400 (Bad Request)異常怎麼排查引數問題

問題描述:

用ajax請求時報post 400 (Bad Request)的異常,前臺js引數JSON.stringify(data),後臺controller 中@RequestBody XX xx(javabean)接收引數。

通常發生400時,即使在後臺方法上設定斷點,但因400是引數由json轉換成Javabean時發生異常,所以不會進入斷點。

此時如果單靠眼力一一排查引數中的每個值,簡直能把眼瞅瞎……還未必能找到……

解決辦法:

辦法一:

從大牛那取經,可以org.springframework.web.servlet.DispatcherServlet中設定斷點,好像是doService方法,下次再遇到自己打算試試。

辦法二:

自己找到了一個low但比較簡單直觀的辦法,哈哈

1.瀏覽器F12,除錯狀態下在network/網路找到400(Bad Request)的請求,複製出該post請求的json格式的請求引數。

以chrome為例,點選“view source”會顯示json字串格式的引數。


2.在後臺方法中將該json字串轉換成JSONObject,再將JSONObject轉換成實體XX。

程式碼:

com.alibaba.fastjson.JSONObject.toJavaObject(
		(com.alibaba.fastjson.JSONObject)(com.alibaba.fastjson.JSONObject.parse("{'ts':1493184921039,'pk':nulll}")),XX.class)
其中的{'ts':1493184921039,'pk':nulll}是請求引數字串(將雙引號改成單引號),JSONObject.parse()方法將其轉換成JSONObject格式;JSONObject.toJavaObject()是轉換為實體XX的方法。

3.執行程式碼,就會報錯,錯誤中會提示那些引數有問題,進而修改就可以啦。

到目前為止遇到過兩次引數的問題,一次是時間戳ts的格式導致400的,當時ts是是由net.sf.json.JSONObject處理過返回給前臺頁面的,等到再將包含該ts的實體json串傳給後臺時就因無法轉換為實體報錯了。第二次就是現在因為實體中的一個屬性是空值,而實體類中該屬性的set方法對該屬性值進行了特殊處理,卻又未判空導致了空指標異常。

如果你們還有更好的方法可以快速定位400異常的,請留言分享,大家一起共同成長。

期待你的高招……