Spring boot 處理 error 的套路
Spring boot 處理 error 的基本流程:
Controller -> 發生錯誤 -> BasicErrorController -> 根據 @RequestMapping(produces) 判斷調用 errorHtml 或者 error 方法
然後:
errorHtml -> getErrorAttributes -> ErrorViewResolver -> 錯誤顯示頁面
error -> getErrorAttributes -> @ResponseBody (直接返回JSON)
如果想要定制一些東西,按照官方文檔的建議可以:
1.繼承 BasicErrorController 擴展處理一個新的 content type
2.自定義 ErrorAttributes 獲得自己想要的結果集
3.實現 ErrorViewResolver 接口,自定義錯誤顯示視圖
Spring boot 默認使用 DefaultErrorViewResolver 作為 ErrorViewResolver 的實現,並配置了 4xx, 5xx 視圖
一般的,並不需要擴展上面的內容,通常情況下,下面兩種方式可以應對大部分場景
1.捕獲異常:
使用 @ControllerAdvice 與 @ExceptionHandler 捕獲異常並處理(返回自定義json對象或是頁面視圖,將替代 ErrorAttributes、ErrorViewResolver)
註意:如 404 等是通過 Servlet (DispatcherServlet.noHandlerFound) 的處理並返回 response ( response.sendError) ,並未到達 Controller 層,所以並不能捕獲到。
2.直接提供相應錯誤顯示視圖,有兩種方式:
靜態頁面
創建 error 文件夾,頁面命名必須是 status code 或 4xx,位置在 Spring boot 靜態資源路徑下
模板頁面
使用模板頁面,默認只需將 error 文件夾放入 templates 下即可
但需要註意如果 prefix 與 suffix 配置 (freemarker),則存放目錄與文件後綴需要作相應的改變
3.覆蓋Spring boot 默認的 error 頁面
將命名為 error.ftl (註意匹配 prefix、suffix)的頁面放入 templates 下即可
註意:不要放入 error 文件夾下,這點與 4xx 頁面不同
默認全局的 error 頁面將顯示所有狀態下的錯誤信息,如果放入 4xx 等頁面後,將優先匹配 4xx 頁面 (根據 status code )
Spring boot 處理 error 的套路