Springboot異常錯誤處理解決方案詳解
1.在有模板引擎的情況下:
springboot會預設找 templates/error/錯誤狀態碼.html,所以我們要定製化錯誤頁面就可以到templates/error下建立一個【對應錯誤狀態碼.html】html檔案,當發生此狀態碼的錯誤springboot就會來到對應的頁面。
同時如果我們想讓400-499之間的錯誤都去同一個錯誤頁面,那我們可以在templates/error下建立一個4xx.html。同理500-599的錯誤可以用5xx.html。
注意:springboot會優先匹配具體的【錯誤狀態碼.html】,然後再匹配4xx,5xx的。例如:發生了404錯誤,springboot優先到templates/error下找404.html,如果沒有404.html,再找有沒有4xx.html,有的話就會使用4xx.html。
在錯誤頁面我們能夠獲取到的資訊:
- timestamp:時間戳
- status:狀態碼
- error:錯誤提示
- exception:異常物件 springboot2.1.6在頁面獲取異常物件要現在全域性配置檔案中加入:server.error.include-exception=true
- message:異常訊息
- errors:JSR資料校驗的錯誤
2.在沒有模板引擎(模板引擎找不到這個錯誤頁面)的情況下,springboot會到靜態資原始檔夾下的error包下找。
3.以上都沒有找到錯誤頁面,就預設用springboot預設的錯誤提示頁面
錯誤異常處理——自定義響應json資料
上邊的錯誤處理中,如果是瀏覽器訪問可以響應我們自己定製的錯誤頁面,但是如果是其他客戶端訪問,則只會響應固定的json資料,如下圖所示:
下邊講解三個異常處理返回自定義json資料的方式
首先編寫一個自定義異常類
public class UserNotExitException extends RuntimeException { public UserNotExitException() { super("使用者不存在"); } }
方式一:
在異常處理器類中,通過map封裝我們自己的json資料,然後將map返回。
@ControllerAdvice public class MyExceptionHandler { @ResponseBody @ExceptionHandler(UserNotExitException.class) public Map<String,Object> userNotExitExceptionHandler(Exception e){ Map<String,Object> map = new HashMap<>(); map.put("code","user.notexit"); map.put("message",e.getMessage()); return map; } }
@ControllerAdvice:表明這是一個全域性異常處理類
@ExceptionHandler(UserNotExitException.class):表明標註的此方法用於處理UserNotExitException異常。
@ResponseBody:將返回結果封裝為json
3.結果
不管瀏覽器還是其他客戶端發生該異常都統一得到下圖的響應
方式二:轉發到/error,進行自適應響應效果處理
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(UserNotExitException.class) public String userNotExitExceptionHandler(Exception e,HttpServletRequest request){ Map<String,Object> map = new HashMap<>(); request.setAttribute("javax.servlet.error.status_code",500); map.put("code","使用者出錯了"); return "forward:/error"; } }
將響應轉發到 /error,讓springboot幫我們生成自適應效果。但是必須注意,一定要設定錯誤狀態碼(如程式碼中標黃色的那一句程式碼)。不設定的話springboot就不會進入定製錯誤頁面的解析流程。設定了之後springboot就會到templates/error/錯誤狀態碼.html頁面處理。
注意:此方式瀏覽器訪問發生錯誤不再響應的是json資料了,而是對於的錯誤響應網頁。
其他客戶端訪問響應的是json資料,但是響應的json資料中沒有我們map中put的資料。
方式三:通過DefaultErrorAttribute
1.在異常處理器類中將響應的json資料封裝到map中,然後再將map放到請求域中
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(UserNotExitException.class) public String userNotExitExceptionHandler(Exception e,"使用者出錯了"); request.setAttribute("ext",map); return "forward:/error"; } }
2.編寫錯誤屬性類:新建一個類繼承DefaultErrorAttribute類,並重寫其中的getErrorAttributes方法
@Component public class MyErrorAttributes extends DefaultErrorAttributes { @Override public Map<String,Object> getErrorAttributes(WebRequest webRequest,boolean includeStackTrace) { Map<String,Object> map = super.getErrorAttributes(webRequest,includeStackTrace); map.put("company","atguigu"); Map<String,Object> ext = (Map<String,Object>) webRequest.getAttribute("ext",0); map.put("ext",ext); return map; } }
注意:
(1).必須將錯誤屬性類新增到spring容器中。
(2).第7行標黃那段程式碼的作用是獲取異常處理類中的map。其中最後的引數0,是從request域中取出資料“ext”。若要從session域中取資料,則將該引數設定為1.(0是從request域獲取資料,1是從session域中獲取資料)
(3).錯誤屬性類中返回的map中的所有內容,頁面都可以獲取到。
總結:
此方式最好,當瀏覽器訪問發生錯誤時,會響應對應的錯誤響應頁面,當其他客戶端訪問發生錯誤時也會響應我們定製的json資料。
瀏覽器響應:
其他客戶端響應:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。