Springboot異常錯誤處理解決方案詳解
1.在有模板引擎的情況下:
springboot會默認(rèn)找 templates/error/錯誤狀態(tài)碼.html,所以我們要定制化錯誤頁面就可以到templates/error下創(chuàng)建一個【對應(yīng)錯誤狀態(tài)碼.html】html文件,當(dāng)發(fā)生此狀態(tài)碼的錯誤springboot就會來到對應(yīng)的頁面。
同時如果我們想讓400-499之間的錯誤都去同一個錯誤頁面,那我們可以在templates/error下創(chuàng)建一個4xx.html。同理500-599的錯誤可以用5xx.html。
注意:springboot會優(yōu)先匹配具體的【錯誤狀態(tài)碼.html】,然后再匹配4xx,5xx的。例如:發(fā)生了404錯誤,springboot優(yōu)先到templates/error下找404.html,如果沒有404.html,再找有沒有4xx.html,有的話就會使用4xx.html。
在錯誤頁面我們能夠獲取到的信息:
timestamp:時間戳 status:狀態(tài)碼 error:錯誤提示 exception:異常對象 springboot2.1.6在頁面獲取異常對象要現(xiàn)在全局配置文件中加入:server.error.include-exception=true message:異常消息 errors:JSR數(shù)據(jù)校驗(yàn)的錯誤2.在沒有模板引擎(模板引擎找不到這個錯誤頁面)的情況下,springboot會到靜態(tài)資源文件夾下的error包下找。
3.以上都沒有找到錯誤頁面,就默認(rèn)用springboot默認(rèn)的錯誤提示頁面
錯誤異常處理——自定義響應(yīng)json數(shù)據(jù)
上邊的錯誤處理中,如果是瀏覽器訪問可以響應(yīng)我們自己定制的錯誤頁面,但是如果是其他客戶端訪問,則只會響應(yīng)固定的json數(shù)據(jù),如下圖所示:
下邊講解三個異常處理返回自定義json數(shù)據(jù)的方式
首先編寫一個自定義異常類
public class UserNotExitException extends RuntimeException { public UserNotExitException() { super('用戶不存在'); }}
方式一:
在異常處理器類中,通過map封裝我們自己的json數(shù)據(jù),然后將map返回。
@ControllerAdvicepublic 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):表明標(biāo)注的此方法用于處理UserNotExitException異常。
@ResponseBody:將返回結(jié)果封裝為json
3.結(jié)果
不管瀏覽器還是其他客戶端發(fā)生該異常都統(tǒng)一得到下圖的響應(yīng)
方式二:轉(zhuǎn)發(fā)到/error,進(jìn)行自適應(yīng)響應(yīng)效果處理
@ControllerAdvicepublic 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','user.notexit'); map.put('message','用戶出錯了'); return 'forward:/error'; }}
將響應(yīng)轉(zhuǎn)發(fā)到 /error,讓springboot幫我們生成自適應(yīng)效果。但是必須注意,一定要設(shè)置錯誤狀態(tài)碼(如代碼中標(biāo)黃色的那一句代碼)。不設(shè)置的話springboot就不會進(jìn)入定制錯誤頁面的解析流程。設(shè)置了之后springboot就會到templates/error/錯誤狀態(tài)碼.html頁面處理。
注意:此方式瀏覽器訪問發(fā)生錯誤不再響應(yīng)的是json數(shù)據(jù)了,而是對于的錯誤響應(yīng)網(wǎng)頁。
其他客戶端訪問響應(yīng)的是json數(shù)據(jù),但是響應(yīng)的json數(shù)據(jù)中沒有我們map中put的數(shù)據(jù)。
方式三:通過DefaultErrorAttribute
1.在異常處理器類中將響應(yīng)的json數(shù)據(jù)封裝到map中,然后再將map放到請求域中
@ControllerAdvicepublic 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','user.notexit'); map.put('message','用戶出錯了'); request.setAttribute('ext',map); return 'forward:/error'; }}
2.編寫錯誤屬性類:新建一個類繼承DefaultErrorAttribute類,并重寫其中的getErrorAttributes方法
@Componentpublic 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行標(biāo)黃那段代碼的作用是獲取異常處理類中的map。其中最后的參數(shù)0,是從request域中取出數(shù)據(jù)“ext”。若要從session域中取數(shù)據(jù),則將該參數(shù)設(shè)置為1.(0是從request域獲取數(shù)據(jù),1是從session域中獲取數(shù)據(jù))
(3).錯誤屬性類中返回的map中的所有內(nèi)容,頁面都可以獲取到。
總結(jié):
此方式最好,當(dāng)瀏覽器訪問發(fā)生錯誤時,會響應(yīng)對應(yīng)的錯誤響應(yīng)頁面,當(dāng)其他客戶端訪問發(fā)生錯誤時也會響應(yīng)我們定制的json數(shù)據(jù)。
瀏覽器響應(yīng):
其他客戶端響應(yīng):
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. CSS3實(shí)現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效2. ASP.NET MVC使用正則表達(dá)式驗(yàn)證手機(jī)號碼3. .NET的基元類型包括什么及Unmanaged和Blittable類型詳解4. Java String不可變性實(shí)現(xiàn)原理解析5. 使用Android Studio實(shí)現(xiàn)為系統(tǒng)級的app簽名6. 基于Python的自媒體小助手---登錄頁面的實(shí)現(xiàn)代碼7. Spring Boot如何通過java -jar啟動8. PHP開發(fā)注意安全問題總結(jié)9. XML 增、刪、改和查示例10. python urllib.request模塊的使用詳解
