Spring boot 處理 error 的套路

Spring boot 處理 error 的基本流程:json

Controller -> 發生錯誤 -> BasicErrorController -> 根據 @RequestMapping(produces) 判斷調用 errorHtml 或者 error 方法app

而後:spa

errorHtml -> getErrorAttributes -> ErrorViewResolver -> 錯誤顯示頁面code

error -> getErrorAttributes -> @ResponseBody (直接返回JSON)對象

若是想要定製一些東西,按照官方文檔的建議能夠:繼承

1.繼承 BasicErrorController  擴展處理一個新的 content type接口

2.自定義 ErrorAttributes 得到本身想要的結果集資源

3.實現 ErrorViewResolver 接口,自定義錯誤顯示視圖文檔

Spring boot 默認使用 DefaultErrorViewResolver 做爲 ErrorViewResolver  的實現,並配置了 4xx, 5xx 視圖get

 

通常的,並不須要擴展上面的內容,一般狀況下,下面兩種方式能夠應對大部分場景

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 )

相關文章
相關標籤/搜索