最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot全局異常處理機(jī)制和配置攔截器方式

 更新時(shí)間:2023年12月11日 16:27:20   作者:勇敢流流  
這篇文章主要介紹了SpringBoot全局異常處理機(jī)制和配置攔截器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot全局異常處理機(jī)制和配置攔截器

關(guān)于SpringBoot的全局異常處理,其實(shí)十分簡單。

首先,要新建一個(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的攔截器配置也是十分簡單,只需要把往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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaMail入門教程之創(chuàng)建郵件(2)

    JavaMail入門教程之創(chuàng)建郵件(2)

    這篇文章主要介紹了JavaMail入門教程之創(chuàng)建郵件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Idea報(bào)錯(cuò): A JNI error has occurred的問題

    Idea報(bào)錯(cuò): A JNI error has occurred的問題

    這篇文章主要介紹了Idea報(bào)錯(cuò): A JNI error has occurred的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • springboot配置文件讀取pom文件信息方式

    springboot配置文件讀取pom文件信息方式

    這篇文章主要介紹了springboot配置文件讀取pom文件信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java ReentrantLock的可重入性與公平鎖機(jī)制詳解

    Java ReentrantLock的可重入性與公平鎖機(jī)制詳解

    這篇文章主要介紹了Java ReentrantLock的可重入性與公平鎖機(jī)制,Java中的ReentrantLock是一個(gè)可重入的互斥鎖,基于AQS實(shí)現(xiàn),它允許同一線程多次獲取同一把鎖,并控制加鎖與釋放,支持公平/非公平策略及tryLock等靈活特性,需要的朋友可以參考下
    2026-02-02
  • Mybatis 中Mapper使用package方式配置報(bào)錯(cuò)的解決方案

    Mybatis 中Mapper使用package方式配置報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Mybatis 中Mapper使用package方式配置報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot FeignClient 如何捕獲業(yè)務(wù)異常信息

    Spring Boot FeignClient 如何捕獲業(yè)務(wù)異常信息

    這篇文章主要介紹了Spring Boot FeignClient 如何捕獲業(yè)務(wù)異常信息的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis入門實(shí)例教程之創(chuàng)建一個(gè)簡單的程序

    MyBatis入門實(shí)例教程之創(chuàng)建一個(gè)簡單的程序

    這篇文章主要介紹了MyBatis入門創(chuàng)建一個(gè)簡單的程序,在?MySQL?中創(chuàng)建數(shù)據(jù)庫?mybatisdemo,編碼為?utf8,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • JVM執(zhí)行引擎的項(xiàng)目實(shí)踐

    JVM執(zhí)行引擎的項(xiàng)目實(shí)踐

    執(zhí)行引擎是Java虛擬機(jī)核心的組成部分之一,本文主要介紹了JVM執(zhí)行引擎的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見的使用方法總結(jié)

    mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見的使用方法總結(jié)

    mybatis-plus是在mybatis的基礎(chǔ)上做增強(qiáng)不做改變,簡化了CRUD操作,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見的使用方法,需要的朋友可以參考下
    2022-09-09
  • java隨機(jī)事件分發(fā)器示例

    java隨機(jī)事件分發(fā)器示例

    這篇文章主要介紹了java隨機(jī)事件分發(fā)器示例,需要的朋友可以參考下,功能需求和代碼實(shí)現(xiàn)在下面
    2014-03-03

最新評(píng)論

汝南县| 垫江县| 东兰县| 萨嘎县| 哈尔滨市| 图木舒克市| 阳信县| 鄂温| 磴口县| 辽阳市| 浦城县| 商洛市| 石柱| 湟源县| 乐东| 田东县| 红安县| 四川省| 明水县| 广灵县| 阿克苏市| 黄大仙区| 南康市| 崇义县| 元阳县| 始兴县| 泉州市| 乌兰浩特市| 扬中市| 西吉县| 五大连池市| 遂宁市| 梧州市| 曲沃县| 广元市| 甘肃省| 隆德县| 中阳县| 苏尼特左旗| 杨浦区| 正阳县|