在對代碼進行調試的時候,前端頁面報了一個錯:
1 {"timestamp":"2019-09-02T02:55:45.555+0000","status":404,"error":"Not Found","message":"No message available”,”path":"/order/createorder"}
這個 bug 出現的原因是因為犯了一個更加低級的錯誤。。。但是我覺得解決問題的分析思路還是可以借鑒的,這里總結一下。
前端頁面顯示錯誤信息,但是在我的后端程序中沒有一個報錯信息,甚至沒有一個異常拋出,而且有關數據成功寫入數據庫,訂單信息寫入數據庫,商品庫存減少,銷量增加,一切數據在后端邏輯來說毫無問題,但是前端為什么報錯呢?於是我把問題固定在前端的 html 文件上了,回去排查前端代碼,打開 chrome 的檢查,刷新頁面,添加斷點,重新刷新,查看變量值:


發現狀態 status 確實是 success,變量數據都完全正確,怎么回事,經過一上午的排查,前端貌似沒有錯。再仔細分析下前端頁面報的錯,404,not found,”path”:”/order/createorder”,難不成后端的控制層代碼有錯,導致前端頁面響應結果沒有找到正確的路徑。回去檢查一下,果不其然,在控制層方法的注解上面漏了 @ResponseBody 注解。
@ResponseBody
先來看看為什么要添加這個注解
The course documentation states that this annotation serves the function to: ensure that the result will be written to the HTTP response by an HTTP Message Converter (instead of an MVC View).
The annotation means is that the returned value of the method will constitute the body of the HTTP response.
The returned value of the method will constitute the body of the HTTP response.
說的都是一個意思,就是 @ResponseBody 用於對方法進行注釋, 表示該方法的返回的結果將直接寫入 HTTP 響應正文(Http Response Body)中。我之前控制層代碼里有返回值,類型為 CommonReturnType 的通用返回值類型,我把返回值去掉后,方法改為 void,無任何返回值, 雖然在前端的調試中,各種數據依然正常,但是前端頁面獲取不到控制層方法的返回值,在 response body 中無內容,導致點擊前端頁面的按鈕不會有任何現象發生,雖然此時后端邏輯正確無誤,數據庫入庫操作都實現了。所以我這里必須給該方法一個返回值,且要通過注解形式將返回值加到 Http response body 中。 如果沒有這個注解,就會拋出上面的 responseText 異常信息。
