SpringBoot全局異常處理機(jī)制和配置攔截器方式
SpringBoot全局異常處理機(jī)制和配置攔截器
關(guān)于SpringBoot的全局異常處理,其實(shí)十分簡(jiǎn)單。
首先,要新建一個(gè)SpringBoot項(xiàng)目添加兩個(gè)依賴,spring-boot-starter-web和spring-boot-starter-thymeleaf。
這個(gè)時(shí)候,我們便可以把異常信息展示在thymeleaf頁面。
編寫接口:
以往的SpringMVC配置在SpringBoot項(xiàng)目中依然生效。
所以可以通過實(shí)現(xiàn)HandlerExceptionResolver接口或者添加@ExceptionHandler注解來處理全局異常。
@ControllerAdvice public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = new ModelAndView("01"); mv.addObject("error",ex.getMessage()); return mv; } }
@ControllerAdvice public class GlobalExceptionHandler2 { @ExceptionHandler(ArithmeticException.class) public ModelAndView resolveException( Exception ex) { ModelAndView mv = new ModelAndView("01"); mv.addObject("error",ex.getMessage()); return mv; } }
thymeleaf視圖必須放在/resources/templates文件夾下,此時(shí)需要新建一個(gè)01.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>測(cè)試頁面</title> </head> <body> <h4>異常信息顯示:</h4> <div th:text="${error}"></div> </body> </html>
注意:SpringBoot項(xiàng)目里面freemarker頁面和thymeleaf頁面不需要配置視圖解析器,Spring會(huì)自動(dòng)幫我們識(shí)別并渲染ftlh和html頁面。
測(cè)試:
以上是SpringMVC配置在SpringBoot中依然適用。
但是基于SpringBoot項(xiàng)目的異常配置,SpringBoot自己也有一套全局異常處理機(jī)制。
SpringBoot異常處理
默認(rèn)方案,在靜態(tài)頁面里面展示異常信息:
但是,必須要在靜態(tài)資源文件夾下新建error文件夾,里面放自己的錯(cuò)誤頁面信息,4xx和5xx為模糊查詢,SpringBoot支持4xx和5xx的狀態(tài)錯(cuò)誤。
這里為了省事,我就在頁面里放了一個(gè)div輸出一句話。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>4xx</title> </head> <body> <div>4xx-static-html</div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>5xx</title> </head> <body> <div>5xx-static-html</div> </body> </html>
測(cè)試結(jié)果為頁面顯示5xx-static-html,在這里還有一個(gè)小細(xì)節(jié),假如我們定義了一個(gè)精確的狀態(tài)碼頁面,例如數(shù)學(xué)算術(shù)錯(cuò)誤為500,定義了一個(gè)500.html,那么是優(yōu)先顯示500的頁面還是5xx的頁面呢,這就涉及一個(gè)優(yōu)先級(jí)的問題。
在這里先埋下一個(gè)伏筆,繼續(xù)往下走。
我們知道thymeleaf實(shí)際上是一個(gè)動(dòng)態(tài)頁面,所以同樣的,我們?cè)趖emplates文件下新建error文件夾放兩個(gè)html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>4xx</title> </head> <body> <div>這是動(dòng)態(tài)展示錯(cuò)誤的頁面:</div> <table border="1"> <tr> <td>出錯(cuò)路徑</td> <td th:text="${path}"></td> </tr> <tr> <td>出錯(cuò)時(shí)間</td> <td th:text="${timestamp}"></td> </tr> <tr> <td>錯(cuò)誤信息</td> <td th:text="${error}"></td> </tr> <tr> <td>狀態(tài)</td> <td th:text="${status}"></td> </tr> </table> </body> </html>
當(dāng)我們?cè)趗rl地址請(qǐng)求一個(gè)不存在的頁面時(shí)觸發(fā),
測(cè)試:
好了,到這里要開始進(jìn)入正題。
由于我們的錯(cuò)誤是數(shù)學(xué)算術(shù)錯(cuò)誤,返回的是java.lang.ArithmeticException,這樣顯然是很難交代的。
首先SpringBoot為我們額外提供了三個(gè)異常信息。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>5xx</title> </head> <body> <div>這是動(dòng)態(tài)展示錯(cuò)誤的頁面:</div> <table border="1"> <tr> <td>出錯(cuò)路徑</td> <td th:text="${path}"></td> </tr> <tr> <td>出錯(cuò)時(shí)間</td> <td th:text="${timestamp}"></td> </tr> <tr> <td>錯(cuò)誤信息</td> <td th:text="${error}"></td> </tr> <tr> <td>狀態(tài)</td> <td th:text="${status}"></td> </tr> <tr> <td>異常</td> <td th:text="${exception}"></td> </tr> <tr> <td>堆棧</td> <td th:text="${trace}"></td> </tr> <tr> <td>異常信息</td> <td th:text="${message}"></td> </tr> </table> </body> </html>
exception、trace和message。
假如我們配置完5xx.html便急著去測(cè)試,結(jié)果如下:
這三個(gè)東西結(jié)果為空,那么小伙伴們肯定很想知道這三個(gè)東西究竟顯示的是什么玩意兒。
別急,我們可以在application.properties中配置三個(gè)東西。
server.error.include-exception=true server.error.include-message=always server.error.include-stacktrace=always
這三個(gè)是什么東西呢,想深究的同學(xué)可以回去看看底層。從字面意思理解,便是開啟這三個(gè)東西,默認(rèn)為不展示。
測(cè)試:
原本是測(cè)試顯示的是java.lang.ArithmeticException,在這里只需要進(jìn)行全局異常處理即可。
/** * 將該類注冊(cè)到 Spring 容器中,此時(shí),默認(rèn)的 DefaultErrorAttributes 就會(huì)失效 */ @Component public class MyErrorAttributes extends DefaultErrorAttributes { @Override public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { //這是默認(rèn)的異常數(shù)據(jù) Map<String, Object> map = super.getErrorAttributes(webRequest,options); //獲取異常 String exception = (String) map.get("exception"); if ("java.lang.ArithmeticException".equals(exception)){ map.put("exception","數(shù)學(xué)算術(shù)異常"); } return map; } }
注意:狀態(tài)頁面先找精確,再找模糊,其次是先動(dòng)態(tài)后靜態(tài)。
SpringBoot配置攔截器
SpringBoot的攔截器配置也是十分簡(jiǎn)單,只需要把往Spring注冊(cè)一個(gè)攔截器即可。
為了方便演示,小編自定義一個(gè)攔截器,在控制臺(tái)打印了三句話。
隨后新建一個(gè)config包把該類注冊(cè)到Spring容器中。
大功告成,進(jìn)入測(cè)試環(huán)節(jié):
這里打印了兩次的原因是,第一次攔截的是happy請(qǐng)求,第二次攔截的是404頁面錯(cuò)誤,因此打印了兩次。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Springboot?過濾器、攔截器、全局異常處理的方案處理小結(jié)
- SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例
- SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式
- SpringBoot搭建全局異常攔截
- springboot攔截器過濾token,并返回結(jié)果及異常處理操作
- SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理
- Spring boot項(xiàng)目中異常攔截設(shè)計(jì)和處理詳解
- Spring Boot統(tǒng)一異常攔截實(shí)踐指南(最新推薦)
相關(guān)文章
Springboot 整合 Java DL4J 實(shí)現(xiàn)智能客服功能
本文主要介紹了如何使用SpringBoot整合JavaDeeplearning4j來構(gòu)建一個(gè)智能客服系統(tǒng),詳細(xì)探討了神經(jīng)網(wǎng)絡(luò)選擇、數(shù)據(jù)集格式、技術(shù)介紹、Maven依賴、代碼示例等內(nèi)容,為構(gòu)建高效、便捷、個(gè)性化的客戶服務(wù)提供了理論支持和實(shí)踐指導(dǎo)2024-10-10使用位運(yùn)算、值交換等方式反轉(zhuǎn)java字符串的多種方法(四種方法)
這篇文章主要介紹了使用位運(yùn)算、值交換等方式反轉(zhuǎn)java字符串,本文通過四種方式給大家講解,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07java8學(xué)習(xí)教程之lambda表達(dá)式的使用方法
Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于java8學(xué)習(xí)教程之lambda表達(dá)式使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09完整的醫(yī)院就診掛號(hào)系統(tǒng)基于Spring MVC + Spring + MyBatis實(shí)現(xiàn)
這篇文章主要介紹了基于Spring MVC + Spring + MyBatis實(shí)現(xiàn)的醫(yī)院就診掛號(hào)系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08java基礎(chǔ)之Integer與int類型輸出示例解析
這篇文章主要為大家介紹了java基礎(chǔ)之Integer與int類型輸出示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06