springboot自定義異常處理


springboot異常處理

Author:SimpleWu

默認錯誤處理機制

SpringBoot默認的錯誤處理直接回返回對應的錯誤視圖頁面。比如404錯誤。

如果是其它客戶端訪問,默認相應一個json數據。比如通過postman來訪問當前頁面。

springboot錯誤頁面處理過程:

SpringBoot的錯誤信息配置是通過ErrorMvcAutoConfiguration來進行配置的,這個類中幫我們注冊了一下組件。

  • DefaultErrorAttributes:幫我們在頁面上共享錯誤信息。
  • BasicErrorController:處理默認的/error請求。分為兩種處理請求的方式,一種是html方式,一種是json方式。
  • ErrorPageCustomizer:系統發生錯誤后,該對象就會生效,來定義請求規則。
  • DefaultErrorViewResolver:默認的錯誤視圖解析器,將錯誤信息解析到相應的錯誤視圖。

處理error請求過程: 一旦系統出現4xx或者 5xx之類的錯誤, ErrorPageCustomizer就會生效(定義錯誤的相應規則),就會來到/error請求。就會被BasicErrorController處理。BasicErrorController會根據請求頭RequestHeaders中的Accept來區分是瀏覽器發送的請求還是其它工具發出的請求。分為兩個處理方法,一個是errorHtml()和error(),在errorHtml()方法中,獲取錯誤狀態信息,由resolveErrorView解析器解析到默認的錯誤視圖頁面。錯誤頁面是/error/404.html頁面。如果templates中error里面有這個頁面404錯誤就會精確匹配404.html如果沒有這個404.html他會模糊匹配4xx.html頁面,如果templates中沒有找到錯誤頁面,它就會去static文件中找。

頁面可以獲取的錯誤信息:

  • timestamp:時間戳。
  • status:狀態碼。
  • error:錯誤提示。
  • exception:異常對象。
  • message:異常消息。
  • errors:數據效驗相關的信息。

注意:static文件夾存放的是靜態頁面,它沒有辦法使用模板引擎表達式

了解了上面的計息過程以后,我們自定義錯誤就簡單了。自定義html錯誤頁面分為兩種情況:

有模板引擎的情況下,在templates文件夾下建立一個error文件夾,里面以錯誤號的方式添加錯誤頁面。我們也可以使用4xx和5xx作為錯誤頁面的文件名來匹配這種類型的其它錯誤,精確優先。

沒有模板引擎的情況下,在靜態資源文件夾下添加以錯誤號命名的錯誤頁面。

自定義異常返回JSON數據

這種異常處理方式沒有自適應效果,不論頁面還是其它工具都會返回json格式的數據。

@ControllerAdvice
public class MyExceptionHandler {
  @ResponseBody
  @ExceptionHandler(RuntimeException.class)
  public Map<String,Object> handleException(Exception e){
  Map<String,Object> map = new HashMap<>();
  map.put("code","user.notexist");
  map.put("message",e.getMessage());
  return map;
  }
}

這種處理方式錯誤碼是500他首先會去模板引擎error中找定制的錯誤頁面,沒有就會去靜態資源文件中error文件夾去。

@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e, HttpServletRequest request){
  Map<String,Object> map = new HashMap<>();
  //傳入我們自己的錯誤狀態碼 4xx 5xx,否則就不會進入定制錯誤頁面的解析流程
  //Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
  request.setAttribute("javax.servlet.error.status_code",500);
  map.put("code","user.notexist");
  map.put("message",e.getMessage());
  //轉發到/error
  return "forward:/error";
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM