Author:SimpleWuhtml
SpringBoot默認的錯誤處理直接回返回對應的錯誤視圖頁面。好比404錯誤。java
若是是其它客戶端訪問,默認相應一個json數據。好比經過postman來訪問當前頁面。spring
springboot錯誤頁面處理過程:json
SpringBoot的錯誤信息配置是經過ErrorMvcAutoConfiguration來進行配置的,這個類中幫咱們註冊了一下組件。瀏覽器
處理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文件中找。springboot
頁面能夠獲取的錯誤信息:工具
注意:static文件夾存放的是靜態頁面,它沒有辦法使用模板引擎表達式
post
瞭解了上面的計息過程之後,咱們自定義錯誤就簡單了。自定義html錯誤頁面分爲兩種狀況:code
有模板引擎的狀況下,在templates文件夾下創建一個error文件夾,裏面以錯誤號的方式添加錯誤頁面。咱們也能夠使用4xx和5xx做爲錯誤頁面的文件名來匹配這種類型的其它錯誤,精確優先。htm
沒有模板引擎的狀況下,在靜態資源文件夾下添加以錯誤號命名的錯誤頁面。
這種異常處理方式沒有自適應效果,不論頁面仍是其它工具都會返回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"; } }