15、SpringBoot-CRUD錯誤處理機制(2)
阿新 • • 發佈:2019-02-09
.com lwp ssr mss ifs tsd arc hbm vmx
二、如何定制錯誤響應
1).如何定義錯誤處理頁面
1.1、有模板引擎的情況下;error/狀態碼; 【將錯誤頁面命名為 錯誤狀態碼.html 放在模板引擎文件夾裏面的error文件夾下】 發生此狀態碼的錯誤就會來到 對應的頁面;可以使用4xx、5xx作為錯誤頁面的文件名來匹配這種類型的所有錯誤 精確優先(優先尋找精確的狀態碼.html);
頁面能獲取的信息( DefaultErrorAttributes) timestamp:時間戳 status:狀態碼 error:錯誤提示 exception:異常對象 message:異常消息 errors:JSR303數據校驗的錯誤都在這裏
1.2、沒有模板引擎(模板引擎找不到這個錯誤頁面),靜態資源文件下找 1.3、默認以上兩中都沒有的時候,默認來到springboot的默認頁面
2)、定制json數據
設置user異常
public class UserException extends RuntimeException { public UserException() { super("the user is not exist!"); } }
異常頁面:
<h1>status:[[${status}]]</h1> <h1>timestamp:[[${timestamp}]]</h1> <h1>error:[[${error}]]</h1> <h1>message:[[${message}]]</h1>
如果此時瀏覽器訪問報錯:
其他客戶端的訪問:
2.1、自定義異常處理返回json數據 沒有自適應效果
@ControllerAdvice public class MyException { @ResponseBody @ExceptionHandler(UserException.class) public Map<Object,String> userExc(Exception e){ Map<Object,String> map = new HashMap<>(); map.put("code","user.not.exist"); map.put("message",e.getMessage()); return map; } }
其他客戶端的訪問:
瀏覽器的訪問:
2.2、轉發到/error進行自適應響應效果處理
@ExceptionHandler(UserException.class) public String userExc(Exception e){ Map<Object,String> map = new HashMap<>(); map.put("code","user.not.exist"); map.put("message",e.getMessage()); return "forward:/error"; }
其他客戶端:
瀏覽器:(此時是系統默認的處理頁面)
在對代碼進行改動
@ExceptionHandler(UserException.class) public String userExc(Exception e, HttpServletRequest request){ Map<Object,String> map = new HashMap<>(); //傳入我們自己的錯誤狀態碼 4xx 5xx //否則就不會進入定制錯誤頁面的解析流程 /** * Integer statusCode = (Integer) request .getAttribute("javax.servlet.error.status_code"); */ request.setAttribute("javax.servlet.error.status_code",400); //此時的數據是無法攜帶出去的 map.put("code","user.not.exist"); map.put("message",e.getMessage()); return "forward:/error"; }瀏覽器:(此時是自定義的錯誤頁面) 其他:
15、SpringBoot-CRUD錯誤處理機制(2)