1. 程式人生 > 其它 >SpringBoot全域性異常處理入門

SpringBoot全域性異常處理入門

技術標籤:springboot

SpringBoot全域性異常處理入門


在開發中,當我們需要構建一個基礎的開發框架時,自定義錯誤頁面、全域性異常處理等技術點,是我們必須考慮的問題,那麼如何在SpringBoot框架的基礎上來優雅的解決這些問題呢?

springboot預設處理基本思路

關於錯誤頁面的處理,SpringBoot提供了預設的支援,基本思路如下:

  1. 當頁面請求發生異常時,會自動請求“/error”控制器;
  2. 此控制器會根據處理型別自動匹配,將處理型別為“text/html”的異常請求特殊處理,其他的異常請求預設處理。
  3. 特殊處理的方式為:根據響應碼去查詢對應的錯誤頁面,例如,響應碼為404,則系統會會在以下兩個路徑去查詢頁面:
    模板路徑:/templates/error/404.html
    靜態資源路徑:/resources/META-INF/resources/error/404.html
    
    如果兩者都不存在,則系統會自動返回一個名稱為“error”的檢視,如果檢視名稱對應的模板頁面(/templates/error.html)不存在,則系統會自動拼接一個錯誤頁面響應給客戶端,如下:
    在這裡插入圖片描述
  4. 預設處理方式為:除處理型別為“text/html”的請求外,其他異常請求,系統統一返回json格式資料,資料格式如下:
    {
      "timestamp"
    : "2020-03-06T05:01:50.054+0000", "status": 404, "error": "Not Found", "message": "No message available", "path": "/x/x" }

自定義異常請求的方式

通過以上對SpringBoot異常請求的預設處理分析,可知,要想自定義異常請求的處理,大致有兩種方式:

  • 依賴預設處理方式,只自定義錯誤頁面內容,這種方式最簡單,缺點是不夠靈活。
  • 自定義異常請求控制器,將所有的異常請求轉發至此控制器處理,這種方式比較靈活,也最常用

方式一:自定義錯誤頁面

如果你想只定義一個錯誤頁面,只需在templates目錄下定義一個error.html即可,所有的異常請求將會自動跳轉至此頁面。

如果你想根據狀態碼不同跳轉到不同的錯誤頁面,只需在templates/error目錄下,根據狀態碼定義錯誤頁面,例如:

如果是404錯誤就會顯示404.html,以此類推,除了寫需要的html頁面不需要其他額外的java程式碼
/error/404.html
/error/400.html
/error/500.html

方式二:自定義異常控制器

自定義異常控制器,是最為靈活的控制錯誤頁面的方式
需要覆寫 ErrorController 介面的 getErrorPath() 方法
程式碼如下:

@Controller
public class MyError implements ErrorController {

    //預設請求地址
    private static final  String ERROR_PATH = "/error";

    /**
     * web頁面異常請求處理
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        HttpStatus statusCode = getStatus(request);
        if (HttpStatus.BAD_REQUEST == status) {
            return new ModelAndView("error/400");
        } else if (HttpStatus.NOT_FOUND == status) {
            return new ModelAndView("error/404");
        } else {
            return new ModelAndView("error/500");
        }
    }

    /**
     * 獲取狀態碼
     * @param request
     * @return
     */
    public Integer getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);	//其他狀態碼
            } catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;    //500
    }

    /**
     * Spring 預設錯誤頁路徑
     * @return
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }
}

以上異常控制器,將請求狀態返回碼為403、404、500的請求分別指向了與之對應的錯誤頁面,將無法預知的狀態碼預設指向404的錯誤頁,當然這個可以根據自己的業務情況而定