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

SpringBoot中異常處理實(shí)戰(zhàn)記錄

 更新時(shí)間:2022年05月01日 10:03:11   作者:huan1993  
在我們實(shí)際項(xiàng)目開放中經(jīng)常需要我們處理很多的異常,如何在spring boot項(xiàng)目里面實(shí)現(xiàn)異常處理呢,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中異常處理的相關(guān)資料,需要的朋友可以參考下

一、背景

在我們編寫程序的過程中,程序中可能隨時(shí)發(fā)生各種異常,那么我們?nèi)绾蝺?yōu)雅的處理各種異常呢?

二、需求

1、攔截系統(tǒng)中部分異常,返回自定義的響應(yīng)。

比如:

系統(tǒng)發(fā)生HttpRequestMethodNotSupportedException異常,我們需要返回如下信息。

http的狀態(tài)碼:返回 405

{
	code: 自定義異常碼,
	message: 錯(cuò)誤消息
}

2、實(shí)現(xiàn)自定義異常的攔截

攔截我們自己寫的 BizException

三、編寫一些異?;A(chǔ)代碼

1、引入jar包

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

注意:

引入spring-boot-starter-validation是為了驗(yàn)證請(qǐng)求的中的參數(shù),然后當(dāng)參數(shù)不滿足時(shí)拋出異常。

2、定義一個(gè)自定義異常

public class BizException extends RuntimeException {
    public BizException() {
    }
    public BizException(String message) {
        super(message);
    }
    public BizException(String message, Throwable cause) {
        super(message, cause);
    }
    public BizException(Throwable cause) {
        super(cause);
    }
    public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

解釋

提供一個(gè) /exception/password api,需要傳遞一個(gè)password參數(shù)

1、當(dāng)不傳遞 password 參數(shù)時(shí)將拋出MethodArgumentNotValidException異常。

2、當(dāng)password傳遞exception參數(shù)時(shí),則拋出BizException異常。

4、測(cè)試

1、不傳遞password參數(shù)響應(yīng)是什么

1、使用默認(rèn)的DefaultHandlerExceptionResolver處理

這個(gè)類DefaultHandlerExceptionResolver是默認(rèn)自動(dòng)配置的。

從上圖中可以看出有一個(gè)默認(rèn)字段的返回值

2、使用ResponseEntityExceptionHandler處理

1、編寫異常處理代碼-使用默認(rèn)的邏輯

@RestControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 此處自定義返回值
        return super.handleMethodArgumentNotValid(ex, headers, status, request);
    }
}

可以看到handleMethodArgumentNotValid方法直接調(diào)用父類的方法,即使用默認(rèn)的處理方式。

從上圖中可以看出返回值是空

2、編寫異常處理代碼-返回值返回自定義內(nèi)容

@Component
@RestControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
	@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 此處自定義返回值
        return super.handleMethodArgumentNotValid(ex, headers, status, request);
    }
        
	@Override
    protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        Set<HttpMethod> supportedMethods = ex.getSupportedHttpMethods();

        // 自定義請(qǐng)求返回值
        Map<String, Object> body = new HashMap<>(4);
        body.put("code", "錯(cuò)誤碼");
        body.put("message", "當(dāng)前請(qǐng)求的方法不支持,支持的請(qǐng)求方法為:" + supportedMethods);

        return new ResponseEntity<>(body, headers, status);
    }
}

由上面的代碼可知handleHttpRequestMethodNotSupported方法返回了自定義的body。

從上圖中可以看出,返回了我們自己定義的返回值。

2、password參數(shù)傳遞exception1、使用ResponseEntityExceptionHandler或DefaultHandlerExceptionResolver處理

由上圖可知返回結(jié)果不對(duì),我們需要自定義返回結(jié)果。

2、返回自定義異常

1、編寫B(tài)izException處理代碼

@RestControllerAdvice
public class BizExceptionHandler {

    @ExceptionHandler(BizException.class)
    public ResponseEntity<Object> handleBizException(BizException exception) {
        // 自定義請(qǐng)求返回值
        Map<String, Object> body = new HashMap<>(4);
        body.put("code", "錯(cuò)誤碼");
        body.put("message", "異常信息為:" + exception.getMessage());
        return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

2、測(cè)試返回結(jié)果

從上圖可知返回了自定義信息

四、注意事項(xiàng)

1、如果實(shí)現(xiàn)自定義異常處理類上使用@RestControllerAdvice注解方法上使用@ExceptionHandler來處理特定的異常

2、ResponseEntityExceptionHandler默認(rèn)處理那些異常

3、使用了ResponseEntityExceptionHandler后,為什么發(fā)生了異常后返回體為空

默認(rèn)情況下,實(shí)現(xiàn)了 ResponseEntityExceptionHandler這個(gè)類后,這個(gè)類處理的所有異常的響應(yīng)結(jié)果都是 null,如果想返回別的值需要我們自己去處理。

五、總結(jié)

1、如果我們想處理自定義異常,則可以使用 @RestControllerAdvice || @ControllerAdvice 配置@ExceptionHandler來使用。

2、如果我們實(shí)現(xiàn)了ResponseEntityExceptionHandler來處理異常,那么默認(rèn)的異常的響應(yīng)結(jié)果為空,如果想不為空,則需要我們自己處理。

3、默認(rèn)情況下,標(biāo)準(zhǔn)的Spring MVC異常會(huì)通過DefaultHandlerExceptionResolver來處理。

六、代碼實(shí)現(xiàn)

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-exception-handler

七、參考文檔

到此這篇關(guān)于SpringBoot中異常處理的文章就介紹到這了,更多相關(guān)SpringBoot異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot Admin 動(dòng)態(tài)修改日志級(jí)別的方法步驟

    Spring Boot Admin 動(dòng)態(tài)修改日志級(jí)別的方法步驟

    這篇文章主要介紹了Spring Boot Admin 動(dòng)態(tài)修改日志級(jí)別的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 多線程-lock與lockInterruptibly的區(qū)別及說明

    多線程-lock與lockInterruptibly的區(qū)別及說明

    文章主要討論了Java中ReentrantLock的lock和lockInterruptibly方法的區(qū)別,以及AQS中的雙向鏈表設(shè)計(jì),lock方法不響應(yīng)中斷,而lockInterruptibly方法會(huì)響應(yīng)中斷,AQS的雙向鏈表設(shè)計(jì)使得線程管理更加高效和靈活,適用于高并發(fā)場(chǎng)景
    2025-02-02
  • 在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法詳解

    在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法詳解

    這篇文章主要介紹了在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一文帶你徹底理解Java序列化和反序列化

    一文帶你徹底理解Java序列化和反序列化

    這篇文章主要介紹了Java序列化和反序列化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    這篇文章主要介紹了Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Intellij IDEA 如何通過數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程)

    Intellij IDEA 如何通過數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程)

    這篇文章主要介紹了Intellij IDEA 如何通過數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Nacos配置中心設(shè)計(jì)原理分析

    Nacos配置中心設(shè)計(jì)原理分析

    今天分享一下Nacos配置變更的相關(guān)知識(shí)點(diǎn),現(xiàn)在使用Java生態(tài)如果使用微服務(wù),如果部署在K8s上,那么可能會(huì)使用ConfigMap來存儲(chǔ)配置文件,如果沒有使用K8s,那么基本上都使用Nacos來做配置中心,所以有必要了解一下Nacos的配置的知識(shí)點(diǎn),本文只是對(duì)其中的部分實(shí)現(xiàn)原理進(jìn)行分析
    2023-10-10
  • Java concurrency集合之LinkedBlockingDeque_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency集合之LinkedBlockingDeque_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    LinkedBlockingDeque是雙向鏈表實(shí)現(xiàn)的雙向并發(fā)阻塞隊(duì)列。該阻塞隊(duì)列同時(shí)支持FIFO和FILO兩種操作方式,即可以從隊(duì)列的頭和尾同時(shí)操作(插入/刪除);并且,該阻塞隊(duì)列是支持線程安全。
    2017-06-06
  • 關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題

    關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題

    這篇文章主要介紹了關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • SpringCloud高可用配置中心Config詳解

    SpringCloud高可用配置中心Config詳解

    Spring Cloud Config 是一個(gè)解決分布式系統(tǒng)的配置管理方案,它包含了 server 和 client 兩個(gè)部分,這篇文章主要介紹了SpringCloud之配置中心Config(高可用),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

西吉县| 剑河县| 嘉黎县| 安吉县| 秭归县| 吴堡县| 兴国县| 宜兰市| 孙吴县| 灵台县| 万安县| 彰化县| 休宁县| 三明市| 平谷区| 库尔勒市| 镇江市| 沐川县| 崇信县| 宁晋县| 黑龙江省| 东平县| 颍上县| 晋江市| 泉州市| 沁水县| 新巴尔虎右旗| 五华县| 特克斯县| 阳高县| 蒙自县| 法库县| 密山市| 浙江省| 明光市| 栾川县| 祁连县| 旺苍县| 绥阳县| 巴彦淖尔市| 平江县|