1. 程式人生 > >Spring boot定製錯誤json資料

Spring boot定製錯誤json資料

定製錯誤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
跳轉到預設頁面

存在問題
定製的錯誤資料,無法攜帶出去