1. 程式人生 > >Spring boot 處理 error 的套路

Spring boot 處理 error 的套路

兩種 pro servle 必須 efi ring 需要 套路 官方

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 的套路