欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、背景

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

二、需求

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

比如:

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

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

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

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

攔截我們自己寫的 BizException

三、編寫一些異?;A代碼

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是為了驗證請求的中的參數(shù),然后當參數(shù)不滿足時拋出異常。

2、定義一個自定義異常

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);
    }
}

解釋

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

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

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

4、測試

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

1、使用默認的DefaultHandlerExceptionResolver處理

這個類DefaultHandlerExceptionResolver是默認自動配置的。

從上圖中可以看出有一個默認字段的返回值

2、使用ResponseEntityExceptionHandler處理

1、編寫異常處理代碼-使用默認的邏輯

@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)用父類的方法,即使用默認的處理方式。

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

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();

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

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

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

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

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

由上圖可知返回結果不對,我們需要自定義返回結果。

2、返回自定義異常

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

@RestControllerAdvice
public class BizExceptionHandler {

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

2、測試返回結果

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

四、注意事項

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

2、ResponseEntityExceptionHandler默認處理那些異常

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

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

五、總結

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

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

3、默認情況下,標準的Spring MVC異常會通過DefaultHandlerExceptionResolver來處理。

六、代碼實現(xiàn)

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

七、參考文檔

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

相關文章

  • Spring + mybatis + mysql使用事物的幾種方法總結

    Spring + mybatis + mysql使用事物的幾種方法總結

    這篇文章主要給大家總結介紹了關于Spring + mybatis + mysql使用事物的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • jdk源碼閱讀Collection詳解

    jdk源碼閱讀Collection詳解

    這篇文章主要介紹了jdk源碼閱讀Collection詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • spring boot啟動時加載外部配置文件的方法

    spring boot啟動時加載外部配置文件的方法

    這篇文章主要給大家介紹了關于spring boot啟動時加載外部配置文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • Spring Boot詳解各類請求和響應的處理方法

    Spring Boot詳解各類請求和響應的處理方法

    平時只是在用SpringBoot框架,但并沒有詳細研究過請求和響應執(zhí)行的一個具體過程,所以本文主要來梳理一下SpringBoot請求和響應的處理過程
    2022-07-07
  • 解決Mybatis?plus實體類屬性與表字段不一致的問題

    解決Mybatis?plus實體類屬性與表字段不一致的問題

    這篇文章主要介紹了Mybatis?plus實體類屬性與表字段不一致解決方法,文末給大家提到了Mybatis-plus中數(shù)據(jù)庫表名和表字段名的相關知識,需要的朋友可以參考下
    2022-07-07
  • java  Callable與Future的詳解及實例

    java Callable與Future的詳解及實例

    這篇文章主要介紹了java Callable與Future的詳解及實例的相關資料,需要的朋友可以參考下
    2017-01-01
  • spring boot使用@Async異步注解的實現(xiàn)原理+源碼

    spring boot使用@Async異步注解的實現(xiàn)原理+源碼

    通常我們都是采用多線程的方式來實現(xiàn)上述業(yè)務功能,但spring 提供更優(yōu)雅的方式來實現(xiàn)上述功能,就是@Async 異步注解,在方法上添加@Async,spring就會借助AOP,異步執(zhí)行方法,接下來通過本文給大家介紹spring boot異步注解的相關知識,一起看看吧
    2021-06-06
  • 詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    前面講解了ReentrantLock加鎖和解鎖的原理實現(xiàn),但是沒有闡述它的可重入、可打斷以及超時獲取鎖失敗的原理,本文就重點講解這三種情況,需要的可以了解一下
    2022-10-10
  • java利用oss實現(xiàn)下載功能

    java利用oss實現(xiàn)下載功能

    這篇文章主要為大家詳細介紹了java利用oss實現(xiàn)下載功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 淺談多線程_讓程序更高效的運行

    淺談多線程_讓程序更高效的運行

    下面小編就為大家?guī)硪黄獪\談多線程_讓程序更高效的運行。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論