色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring Boot怎么通過注解來實現全局異常處理的

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-13 10:58 ? 次閱讀

前言

在平時的 API 開發過程中,總會遇到一些錯誤異常沒有捕捉到的情況。那有的小伙伴可能會想,這還不簡單么,我在 API 最外層加一個 try...catch 不就完事了。

哈哈哈,沒錯。這種方法簡單粗暴。小編曾經也是這么干的,但是你轉過來想一想,你會在每一個 API 入口,都去做 try...catch 嗎?這樣不是代碼非常丑陋的。小伙伴開始思考,突然靈光一現,說我們實現一個 AOP 來做這事不就完了。沒錯,使用 AOP 來實現是最佳的選擇。

現在就給大家來介紹介紹 Spring Boot 怎么通過注解來實現全局異常處理的。

主角 @ControllerAdvice@ExceptionHandler

我們先來介紹一下今天的主角,分別是 @ControllerAdvice@ExceptionHandler 。

  • @ControllerAdvice 相當于 controller 的切面,主要用于 @ExceptionHandler, @InitBinder@ModelAttribute,使注解標注的方法對每一個 controller 都起作用。默認對所有 controller 都起作用,當然也可以通過 @ControllerAdvice 注解中的一些屬性選定符合條件的 controller 。
  • @ExceptionHandler 用于異常處理的注解,可以通過 value 指定處理哪種類型的異常還可以與 @ResponseStatus 搭配使用,處理特定的 http 錯誤。標記的方法入參與返回值都有很大的靈活性,具體可以看注釋也可以在后邊的深度探究。

案例分析

今天我們就通過幾種案例的方式,來給大家分析分析,怎么通過全局異常處理的方式玩轉 Spring Boot 的全局異常處理。

案例一

一般的異常處理,所有的API都需要有相同的異常結構。

圖片

exception1

在這種情況下,實現是非常簡單的,我們只需要創建 GeneralExceptionHandler 類,用 @ControllerAdvice 注解來注解它,并創建所需的 @ExceptionHandler ,它將處理所有由應用程序拋出的異常,如果它能找到匹配的 @ExceptionHandler,它將相應地進行轉換。

@ControllerAdvice
public class GeneralExceptionHandler {
    @ExceptionHandler(Exception.class)
    protected ResponseEntity< Error > handleException(Exception ex) {
       MyError myError = MyError.builder()
                         .text(ex.getMessage())
                         .code(ex.getErrorCode()).build();
       return new ResponseEntity(myError,
                               HttpStatus.valueOf(ex.getErrorCode()));
    }
}

案例二

我們有一個API,它需要有一個或多個異常以其他格式處理,與其他應用程序的 API 不同。

圖片

exception2

我們可以采取兩種方式來實現這種情況。我們可以在 OtherController 內部添加 @ExceptionHandler 來處理 OtherException ,或者為 OtherController 創建新的@ControllerAdvice,以備我們也想在其他 API 中處理 OtherException

OtherController 中添加 @ExceptionHandler 來處理 OtherException 的代碼示例。

@RestController
@RequestMapping("/other")
public class OtherController {
    @ExceptionHandler(OtherException.class)
    protected ResponseEntity< Error > handleException(OtherException ex) {
      MyOtherError myOtherError = MyOtherError.builder()
                         .message(ex.getMessage())
                         .origin("Other API")
                         .code(ex.getErrorCode()).build();
      return new ResponseEntity(myOtherError,
                               HttpStatus.valueOf(ex.getErrorCode()));
    }
}

只針對 OtherController 控制器@ControllerAdvice 的代碼示例

@ControllerAdvice(assignableTypes = OtherController.class)
public class OtherExceptionHandler {
    @ExceptionHandler(OtherException.class)
    protected ResponseEntity< Error > handleException(OtherException ex) {
      MyOtherError myOtherError = MyOtherError.builder()
                         .message(ex.getMessage())
                         .origin("Other API")
                         .code(ex.getErrorCode()).build();
      return new ResponseEntity(myOtherError,
                               HttpStatus.valueOf(ex.getErrorCode()));
    }
}

案例三

與案例二類似,我們有一個 API 需要以不同于應用程序中其他 API 的方式對異常進行格式化,但這次所有的異常都需要進行不同的轉換。

圖片exception3

為了實現這個案例,我們將不得不使用兩個 @ControllerAdvice,并加上 @Order 注解的注意事項。因為現在我們需要告訴 Spring,在處理同一個異常時,哪個 @ControllerAdvice 的優先級更高。如果我們沒有指定 @Order,在啟動時,其中一個處理程序將自動注冊為更高的順序,我們的異常處理將變得不可預測。例如,我最近看到一個案例,如果你使用 mvn springboot:run 任務啟動一個應用程序,OtherExceptionHandler 是主要的,但是當以jar形式啟動時,GeneralExceptionHandler 是主要的。

@ControllerAdvice
public class GeneralExceptionHandler {
    @ExceptionHandler(Exception.class)
    protected ResponseEntity< Error > handleException(Exception ex) {
       MyError myError = MyError.builder()
                         .text(ex.getMessage())
                         .code(ex.getErrorCode()).build();
       return new ResponseEntity(myError,
                               HttpStatus.valueOf(ex.getErrorCode()));
    }
}
@ControllerAdvice(assignableTypes = OtherController.class)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class OtherExceptionHandler {
    @ExceptionHandler(Exception.class)
    protected ResponseEntity< Error > handleException(Exception ex) {
       MyError myError = MyError.builder()
                         .message(ex.getMessage())
                         .origin("Other API")
                         .code(ex.getErrorCode()).build();
       return new ResponseEntity(myError,
                               HttpStatus.valueOf(ex.getErrorCode()));
    }
}

總結

經過上述的幾個案例,指北君覺得大家應該已經能夠輕松應對 Spring Boot 中大部分的全局異常處理的情況。

細心的同學也許會覺得為什么不使用 @RestControllerAdvice 呢?如果是用的 @RestControllerAdvice 注解,它會將數據自動轉換成JSON格式,不再需要 ResponseEntity 的處理來。這種與 ControllerRestController 類似,本質是一樣的,所以我們在使用全局異常處理之后可以進行靈活的選擇處理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • API
    API
    +關注

    關注

    2

    文章

    1502

    瀏覽量

    62101
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68685
  • SpringBoot
    +關注

    關注

    0

    文章

    173

    瀏覽量

    183
收藏 人收藏

    評論

    相關推薦

    Spring Boot如何實現異步任務

    Spring Boot 提供了多種方式實現異步任務,這里介紹三種主要實現方式。 1、基于注解
    的頭像 發表于 09-30 10:32 ?1443次閱讀

    啟動Spring Boot項目應用的三種方法

    首先大家了解什么是Spring Boot?Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用
    發表于 01-14 17:33

    使用Spring自定義注解實現

    執行器。其本質就是通過外部參數進行一次路由和Spring mvc做的事情類似。簡單看了Spring mvc的實現原理之后,決定使用自定義注解
    發表于 09-28 11:55 ?0次下載

    Spring Boot框架錯誤處理

    》 《strong》翻譯《/strong》:雁驚寒《/p》 《/blockquote》《p》《em》摘要:本文通過實例介紹了使用Spring Boot在設計API的時候如何正確地對異常
    發表于 09-28 15:31 ?0次下載

    Spring Boot 系列(八)@ControllerAdvice 攔截異常并統一處理

    Spring Boot 系列(八)@ControllerAdvice 攔截異常并統一處理spring 3.2中,新增了@Controll
    發表于 01-16 18:39 ?308次閱讀

    Spring Boot Web相關的基礎知識

    Boot的第一個接口。接下來將會將會介紹使用Spring Boot開發Web應用的相關內容,其主要包括使用spring-boot-starter-web組件
    的頭像 發表于 03-17 15:03 ?661次閱讀

    簡述Spring Boot數據校驗

    上一篇文章我們了解了Spring Boot Web相關的知識,初步了解了spring-boot-starter-web,還了解了@Contrler和@RestController的差別,如果
    的頭像 發表于 03-17 15:07 ?787次閱讀

    Spring Web MVC注解

    RequestMapping注解的主要用途是將Web請求與請求處理類中的方法進行映射。Spring MVC和Spring WebFlux都通過
    的頭像 發表于 04-07 11:32 ?609次閱讀
    <b class='flag-5'>Spring</b> Web MVC<b class='flag-5'>注解</b>

    Spring Bean相關的4個注解及使用方法

    ComponentScan`注解用于配置Spring需要掃描的被組件注解注釋的類所在的包??梢?b class='flag-5'>通過配置其basePackages屬性或者value屬性
    的頭像 發表于 04-07 11:33 ?1356次閱讀
    <b class='flag-5'>Spring</b> Bean相關的4個<b class='flag-5'>注解</b>及使用方法

    容器配置及Spring Boot注解

    Autowired注解用于標記Spring將要解析和注入的依賴項。此注解可以作用在構造函數、字段和setter方法上。
    的頭像 發表于 04-07 11:45 ?586次閱讀
    容器配置及<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>注解</b>

    Spring中@Component注解是怎么實現

    想必`@Component`注解大家一直在使用,只要類上加上它,就可以被Spring容器管理,那大家有想過它是怎么實現的嗎?本篇文章就帶領到家揭秘。
    的頭像 發表于 04-07 15:23 ?1604次閱讀
    <b class='flag-5'>Spring</b>中@Component<b class='flag-5'>注解</b>是怎么<b class='flag-5'>實現</b>的

    Spring Boot啟動 Eureka流程

    Spring Boot 啟動 eureka 的關鍵注解就在 @EnableEurekaServer 上面。 @Target ({ElementType.TYPE}) @Retention
    的頭像 發表于 10-10 11:40 ?897次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學者會比較困惑,Spring Boot 是如何做到將應用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發表于 10-13 11:44 ?654次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設計目標

    ,這樣我們就可以盡快的上手。 使用 Spring Boot 不僅可以創建基于 war 方式部署的傳統Java應用程序,也可以通過創建獨立的不依賴任何容器(如 tomcat 等)
    的頭像 發表于 10-13 14:56 ?590次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設計目標

    springboot核心注解

    Spring Boot 是基于 Spring 框架的開源框架,它可以幫助開發者快速構建、部署和運行獨立的、生產級的 Spring 應用程序。Spri
    的頭像 發表于 11-23 09:23 ?532次閱讀
    主站蜘蛛池模板: 猪蜜蜜网站在线观看电视剧| 天天插天天射天天干| 暖暖免费观看日本在线视频| 在线观看免费精品国产| 美女脱精光让男生桶下面| qvod 艺术片| 我半夜摸妺妺的奶C了她| 精品亚洲AV无码蜜芽麻豆| 亚洲AV无码久久流水呻蜜桃久色| 精品国产麻豆AV无码| 5g在线视讯年龄确认海外禁止进入| 欧美 另类 美腿 亚洲 无码 | 亚洲欧美国产双大乳头| 国产精品一久久香蕉国产线看| 亚洲人女同志video| 欧美成人性色生活18黑人| 国产精品婷婷五月久久久久| 一品道门免费视频韩国| 欧美一区二区在线观看| 国产在线观看黄| 99久久免热在线观看| 免费精品国产日韩热久久| 国产AV视频一区二区蜜桃| 伊人久久综合影院| 肉动漫无修3D在线观看| 国产成人精品免费青青草原app| 日本免费一区二区三区四区五六区| 国产女合集小岁9三部| 6080yy亚洲久久无码| 午夜福到在线4国产| 国产人妻麻豆蜜桃色精| 2021国产精品视频一区| 我要搞av| 欧美色图一区二区三区| 精品无人区麻豆乱码无限制 | 国产精品JIZZ在线观看A片| 11 13加污女qq看他下面| 香蕉久久夜色精品国产小优 | 国产精品乱码一区二区三| free俄罗斯性xxxxhd派对| 一本道无码v亚洲|