Spring boot定製錯誤json資料
阿新 • • 發佈:2018-12-26
定製錯誤json資料
客戶端訪問
如果,程式出錯了
返回的json資料,需要定製的
定製錯誤頁面
在模板資料夾、或者靜態資原始檔夾下
放置一個error資料夾,裡面存放錯誤狀態碼對應的頁面
這些頁面,就是錯誤頁面
在錯誤頁面,可以獲取相關的錯誤資訊
自定義異常
UserNotExistException
為了使異常丟擲,繼承執行時異常
寫一個無參的構造器,呼叫super,傳遞一個message
package com.atguigu.springboot.exception;
public class UserNotExistException extends RuntimeException {
public UserNotExistException() {
super("使用者不存在");
}
}
Controller
根據指定使用者,丟擲自定義的異常
@ResponseBody
@RequestMapping("/hello")
public String hello(@RequestParam("user") String user){
if(user.equals("aaa")){
throw new UserNotExistException();
}
return "Hello World";
}
定義錯誤頁面
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
<h1>status:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
</main>
瀏覽器訪問
自定義異常處理器
MyExceptionHandler
專門用來處理異常,需要新增@ControllerAdvice註解
處理什麼異常,需要新增@ExceptionHandler註解
引數,直接寫Exception,表示處理所有異常
@ControllerAdvice
public class MyExceptionHandler {
//1、瀏覽器客戶端返回的都是json
@ResponseBody
@ExceptionHandler(UserNotExistException.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;
}
}
客戶端訪問
返回自定義,錯誤json資料
訪問頁面
也是返回自定義,錯誤json資料
缺點
沒有自適應效果
瀏覽器,客戶端返回的都是json資料
ErrorMvcAutoConfiguration
錯誤自動配置
BasicErrorController
處理/error請求
/error請求是自定義的
瀏覽器,返回頁面
客戶端,返回json資料
MyExceptionHandler
修改自定義異常處理器
轉發到/error請求
@ControllerAdvice
public class MyExceptionHandler {
//1、瀏覽器客戶端返回的都是json
// @ResponseBody
// @ExceptionHandler(UserNotExistException.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;
// }
@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", "使用者出錯啦");
request.setAttribute("ext", map);
//轉發到/error
return "forward:/error";
}
}
注意
需要傳入,異常的錯誤狀態碼
不傳的話,預設狀態碼為200
跳轉到預設頁面
存在問題
定製的錯誤資料,無法攜帶出去