SpringBoot 錯誤處理機制

image

關注我,一個仍存夢想的屌絲程序員,每天爲你分享高質量編程博客。

回覆 “代金券”  免費獲取騰訊雲和阿里雲代金券

image

1、如何定製錯誤的頁面;

(1.1)有模板引擎的情況下
將錯誤頁面命名爲錯誤狀態碼.html放在模板引擎文件夾裏面的error文件夾下,當程序發生此狀態碼的錯誤就會來到對應的錯誤頁面;

image

我們可以使用4xx和5xx作爲錯誤頁面的文件名來匹配這種類型的所有錯誤,精確優先(優先尋找狀態碼.html,其次是4xx或5xx.html);

錯誤頁面能獲取的信息:

timestamp:時間戳
status:狀態碼
error:錯誤提示
exception:異常對象
message:異常消息
errors:JSR303數據校驗的錯誤都在這裏
<h1>status:[[${status}]]</h1>
<p>error:[[${error}]]</p>
<p>exception:[[${exception}]]</p>
<p>message:[[${message}]]</p>
<p>errors:[[${errors}]]</p>
<p>timestamp:[[${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}]]</p>

(1.2)沒有模板引擎(模板引擎找不到這個錯誤頁面)
靜態資源文件夾下找相關的錯誤頁面

image

SpringBoot會在默認的靜態資源文件路徑下找錯誤頁面,但這個頁面不能動態獲取錯誤信息

(1.3)以上都沒有錯誤頁面
就是默認來到SpringBoot默認的錯誤提示頁面

2、如何定製錯誤的json數據

無論瀏覽器還是Postman等其他訪問方式都會返回json格式的錯誤信息

/**
 * 異常處理器
 */
@ControllerAdvice
public class MyExceptionHandler {
​
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map<String,Object> handleException(Exception e/*傳入異常的信息*/){
        Map<String,Object> map = new HashMap<>();
        map.put("code",1);
        map.put("message",e.getMessage());
        return map;
    }
}

瀏覽器進入定製的錯誤頁面,Postman照常返回json格式

 @ExceptionHandler(MyException.class)
    public String handleException(Exception e/*傳入異常的信息*/, HttpServletRequest request){
        Map<String,Object> map = new HashMap<>();
        System.out.println(e);
        // 傳入自己的狀態碼
        request.setAttribute("javax.servlet.error.status_code",404);
        map.put("code",1);
        map.put("message",e.getMessage());
        return "forward:/error";
    }

主要操作是:傳入自己的狀態碼request.setAttribute("javax.servlet.error.status_code",4xx);,如果沒有這行代碼,瀏覽器訪問異常會自動跳到SpringBoot默認的錯誤頁面

定製數據加入到json裏返回給客戶端,並且瀏覽器響應爲指定錯誤頁面

@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","myErrorHandler"); // 可以給json返回值添加自己的字段和值
​
        // 將異常處理器的異常值保存在request裏,然後在這裏取出來保存起來
        Map<String, Object> resultMap = (Map<String, Object>) webRequest.getAttribute("result",0);
        map.put("result",resultMap);
        return map;
    }
}
/*--(分割線)---------------異常處理器MyExceptionHandler--------------*/
    @ExceptionHandler(MyException.class)
    public String handleException(Exception e/*傳入異常的信息*/, HttpServletRequest request){
        Map<String,Object> map = new HashMap<>();
        System.out.println(e);
        // 傳入自己的狀態碼
//        request.setAttribute("javax.servlet.error.status_code",404);
        map.put("code",1);
        map.put("message",e.getMessage());
        // 保存到request裏
        request.setAttribute("result",map);
        return "forward:/error";
    }

頁面上能用的數據,或者是json返回能用的數據都是通過errorAttributes.getErrorAttributes得到;,容器中默認使用DefaultErrorAttributes.getErrorAttributes()方法進行數據處理的;

image

返回結果

回覆 ” spring boot “ 獲取 spring boot 相關文章

回覆關鍵字:

1、回覆 “10”  查看 最有價值的10個spring boot開源項目

2、回覆 “國旗”  獲取國旗頭像教程

3、回覆 “Ubuntu”  獲取100 個最佳 Ubuntu 應用 和 linux神器

4、回覆 “ idea ”  獲取**最新idea破解教程 和 裝逼神奇

5、回覆 “ ssh ”  獲取史上最好的 ssh工具  支持mac

6、回覆 “ 代金券 ”  騰訊雲和阿里雲代金券

7、回覆 “免費” 可以獲取免費的java面試資源和學習視頻

image

推薦閱讀:

springboot集成ES實現磁盤文件全文檢索

oauth2 認證服務器 資源服務器分離 使用Redis存儲Token

Spring Boot最核心的27個註解,你瞭解多少?

Spring-Boot-Starter開發手冊全集

MySQL優化-一篇文章就夠了(轉發加收藏吧)

程序員一般可以從什麼平臺接私活?

看完這14張思維導圖,你的python纔算入門

手把手講解 OkHttp硬核知識點(1)

Python 爬取微信公衆號文章和評論 (有源碼)

Java 開發人員常用的服務配置(Nginx、Tomcat、JVM、Mysql、Redis)

騰訊電話面試總結—Linux運維工程師

python爬蟲:(嘿嘿嘿)爬你喜歡的照片

面試官問我:一個 TCP 連接可以發多少個 HTTP 請求?我竟然回答不上來…

教你迅雷&百度非會員也能享受不限速的特權

Chrome開發者工具(DevTools)使用技巧

100個最有價值的開源項目–微信開發系列

IDEA 2019 最新激活教程

一臺Linux服務器可以負載多少個連接?(底部有福利)

免責聲明:

1.本公衆號所轉載文章均來自公開網絡。

2.如果出處標註有誤或侵犯到原著作者權益,請聯繫刪除。

3.轉載本公衆號中的文章請註明原文鏈接和作者,否則產生的任何版權糾紛均與本公衆號無關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章