SpringBoot全域性異常處理入門
阿新 • • 發佈:2020-12-07
技術標籤:springboot
SpringBoot全域性異常處理入門
在開發中,當我們需要構建一個基礎的開發框架時,自定義錯誤頁面、全域性異常處理等技術點,是我們必須考慮的問題,那麼如何在SpringBoot框架的基礎上來優雅的解決這些問題呢?
springboot預設處理基本思路
關於錯誤頁面的處理,SpringBoot提供了預設的支援,基本思路如下:
- 當頁面請求發生異常時,會自動請求“/error”控制器;
- 此控制器會根據處理型別自動匹配,將處理型別為“text/html”的異常請求特殊處理,其他的異常請求預設處理。
- 特殊處理的方式為:根據響應碼去查詢對應的錯誤頁面,例如,響應碼為404,則系統會會在以下兩個路徑去查詢頁面:
如果兩者都不存在,則系統會自動返回一個名稱為“error”的檢視,如果檢視名稱對應的模板頁面(/templates/error.html)不存在,則系統會自動拼接一個錯誤頁面響應給客戶端,如下:模板路徑:/templates/error/404.html 靜態資源路徑:/resources/META-INF/resources/error/404.html
- 預設處理方式為:除處理型別為“text/html”的請求外,其他異常請求,系統統一返回json格式資料,資料格式如下:
{ "timestamp"
自定義異常請求的方式
通過以上對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的錯誤頁,當然這個可以根據自己的業務情況而定