SpringBoot ?@ControllerAdvice 處理異常

應用中的異常,有兩件事要考慮,怎么處理這個異常,怎么把異常可讀性高地返回給前端用戶

1.怎么把異常可讀性高的返回給前端用戶或API的消費者

自定義錯誤代碼和錯誤內容

2.怎么處理異常

比如遇到某個異常時需要發郵件通知IT團隊

@ControllerAdvice 是 Spring Framework 提供的一個注解,用于定義全局的異常處理、數據綁定和模型屬性的增強。

它的主要作用是集中管理控制器的全局邏輯,例如異常處理,而不需要在每個控制器中重復編寫相同的代碼。 ?

主要功能

全局異常處理:通過 @ExceptionHandler 注解 捕獲并處理控制器中拋出的異常。

全局數據綁定:通過 @InitBinder 注解對請求參數進行預處理。

全局模型屬性:通過 @ModelAttribute 注解為所有控制器提供公共的模型數據

3.自定義錯誤代碼和內容,并且使用@ControllerAdvice統一處理異常

3.1 自定義錯誤碼,可以把Demo換成projectname

public enum ExceptionCode {IN_VALID_REQUEST("Demo0001", ""),BAD_REQUEST("Demo400", "Bad Request"),NOT_FOUND("Demo404", "Resource Not Found"),INTERNAL_SERVER_ERROR("Demo500", "Internal Server Error");private final String code;private final String message;ExceptionCode(String code, String message) {this.code = code;this.message = message;}public String getCode() {return code;}public String getMessage() {return message;}
}

3.2 自定義異常InvalidationException

public class InvalidationRequestException extends RuntimeException {public InvalidationRequestException(String message) {super(message);}public InvalidationRequestException(String message, Throwable cause) {super(message, cause);}
}

3.3 自定義ExceptionAdvice,統一處理exception

當controller中拋出InvalidationRequestException時,就會被@ControllerAdvice 中的 @ExceptionHandler handleInvalidationException()方法捕獲并處理該異常

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(InvalidationRequestException.class)@ResponseBodypublic ResponseEntity<Map<String, String>> handleInvalidationException(InvalidationRequestException ex) {logger.warn("InvalidationRequestException: {}", ex.getMessage());//其它異常處理邏輯,比如發郵件,打電話通知IT團隊//返回給UI或API消費者Map<String, String> response = new HashMap<>();response.put("code", ExceptionCode.IN_VALIDATED_REQUEST.getCode());response.put("detail",ex.getMessage());return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGenericException(Exception ex) {return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

3.4 controller, 拋出InvalidationException異常

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/validate")public String validateParameter(@RequestParam String input) {if (input == null || input.trim().isEmpty()) {throw new InvalidationRequestException("Input parameter is invalid or empty");}return "Input is valid: " + input;}
}

3.5 測試

啟動應用,訪問?http://localhost:8082/validate?input

校驗失敗時,返回http狀態碼是400,body如下

{"code": "Demo0001","detail": "Input parameter is invalid or empty"}

==========================================

1.異常直接拋出

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/throwException")public String throwException() {throw new RuntimeException("This is a runtime exception!");}
}

啟動應用,訪問?http://localhost:8082/throwException

會獲得一個狀態碼為500的異常?An error occurred: This is a runtime exception!

思考:這個異常對用戶或者call API的消費者來說,可讀性太低,不能明確的知道是什么錯誤

2.自定義狀態碼和錯誤信息,返回給前端用戶或者API 消費者可讀性高的異常

自定義錯誤碼,可以把Demo換成projectname

public enum ExceptionCode {IN_VALIDATED_REQUEST("Demo0001", ""),BAD_REQUEST("Demo400", "Bad Request"),NOT_FOUND("Demo404", "Resource Not Found"),INTERNAL_SERVER_ERROR("Demo500", "Internal Server Error");private final String code;private final String message;ExceptionCode(String code, String message) {this.code = code;this.message = message;}public String getCode() {return code;}public String getMessage() {return message;}
}

controller拋出異常

import com.example.demo_async.exception.ExceptionCode;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
public class DemoController {@GetMapping("/testErrorCode")public ResponseEntity<Map<String, String>> testErrorCode() {Map<String, String> response = new HashMap<>();response.put("code", ExceptionCode.BAD_REQUEST.getCode());response.put("detail", ExceptionCode.BAD_REQUEST.getMessage());return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);}
}

返回http status? 400, body 如下

{"code": "Demo400","detail": "Bad Request"}

思考:如果有很多個controller方法都會拋出這個異常,就需要在每個方法里寫一遍異常處理的邏輯,會產生大量的重復代碼,怎么解決呢?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84785.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爬百度圖片如何解決{“antiFlag“:1,“message“:“Forbid spider access“}

在學習深度學習的卷積神經算法時&#xff0c;需要貓和狗的訓練數據集。這時想到在百度網上爬取貓和狗的圖片。 在爬取狗狗圖片的時候&#xff0c;我抓包分析了下獲取這個url1 “https://image.baidu.com/search/index?tnbaiduimage&ipnr&ct201326592&cl2&lm&…

QWebEngine

Qt自帶的QWebEngine 不支持播放MP4, 需要手動編譯QWebEngine模塊 不支持播放mp4 // mainwindow.cpp , m_webEngine(new MyWebEngine(this)) void MainWindow::init() { //關閉系統代理&#xff0c;提高速度,采用release會更快QNetworkProxyFactory::setUseSystemConfigurati…

Rust 學習筆記1

Basic基礎 actix_web基礎 #[get("/favicon")] 獲取靜態圖片 #[get("/welcome")] 簡單的歡迎 #`/user/{name}/` basic.rs源碼 源碼 use std::{convert::Infallible, io};use actix_files::{Files, NamedFile}; use actix_session::{storage::Cooki…

3GPP協議PDF下載

https://www.tech-invite.com/3m38/tinv-3gpp-38.html 可以進入3GPP官網界面&#xff0c;也可以進入PDF下載界面 PDF加載比較慢

高性能服務器程序框架知識梳理

服務器編程框架 服務器程序種類有很多&#xff0c;但是基本框架都一樣&#xff0c;核心不同點在于邏輯處理單元。基本框架包含&#xff1a;I/O處理單元、邏輯單元、網絡存儲單元以及請求隊列。 I/O處理單元&#xff08;主線程&#xff09;&#xff1a;服務器用來管理客戶連接…

【AI】從0開始玩轉混元3D?模型,如何讓一張靜態實物圖片一鍵轉為3D實物圖,大模型都表示服了,超級簡單易上手,快來試試!

HAI 與 NVIDIA &#xff0c;為開發者提供一鍵部署及生圖的能力&#xff0c;讓開發者體驗3D 模型的同時&#xff0c;也了解云的便利性。 混元3D 2.0是騰訊推出的尖端3D?成模型&#xff0c;能夠創建帶有?分辨率紋理貼圖的?保真3D資產 參賽報名&#xff1a;https://marketing.c…

電路圖識圖基礎知識-電動機的保護電路保護方式(二十六)

電動機保護電路是確保電動機安全、可靠運行的關鍵技術之一。在工業和日常生活中&#xff0c;電動機被廣泛應用于各種設備中&#xff0c;其安全運行對于保障生產效率和人身安全至關重要。本文將詳細介紹電動機保護電路的重要性、保護方式以及具體的電路分析&#xff0c;以期為電…

【Pandas】pandas DataFrame droplevel

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**從 DataFrame 的索引&#xff08;行或列&#xff09;中刪除指定層級&#xff08;level&#xff09;**的方法 pandas.DataFrame.droplevel() pandas.DataFrame.droplev…

Delivering Arbitrary-Modal Semantic Segmentation(CVPR2023)任意模態語義分割論文閱讀

文章目錄 文章研究思路創建了DeLiVER任意模態分割基準數據集統計信息4種模態25個語義類 提出了任意跨模態分割模型CMNeXt自查詢中心&#xff08;Self-Query Hub&#xff0c;SQ-Hub&#xff09;并行池化混合器&#xff08;Parallel Pooling Mixer&#xff0c;PPX&#xff09; 實…

進程控制

一. 進程創建 1.fork的概念與使用 在 Linux 中 fork 可以在一個進程中創建一個新的進程。這個新進程稱為子進程&#xff0c;原進程為父進程。使用前需要包含頭文件 #include <unistd.h> 。在調用 fork 函數時&#xff0c;子進程與父進程會共享數據和代碼&#xff0c;此…

造輪子系列:從0到1打造生產級HTTP客戶端,優雅封裝OkHttp/HttpClient,支持異步、重試與文件操作

TechZhi HTTP Client Starter 源碼特性快速開始1. 添加依賴2. 配置3. 使用 主要功能支持的HTTP方法文件操作功能高級功能配置示例 API使用示例基本請求自定義請求異步請求文件操作示例錯誤處理 構建和測試依賴說明 本文將介紹一款本人開發的高性能Spring Boot HTTP客戶端Starte…

Java過濾器的基本概念

概述 Java 過濾器是 Java EE (Jakarta EE) 中的一種組件&#xff0c;用于在請求到達 Servlet 或 JSP 之前對其進行預處理&#xff0c;或者在響應返回客戶端之前對其進行后處理。過濾器主要應用于以下場景&#xff1a; 請求參數過濾和轉換字符編碼處理身份驗證和授權日志記錄壓…

gbase8s數據庫獲取jdbc/odbc協議的幾種方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 參數 &#xff0c;明文協議&#xff0c;并發時 會錯亂&#xff0c;適合單線程調試 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc參數&#xff0c;密文協議&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 層詳解 7】【AdapterProperties介紹】

前面我們提到了 藍牙協議棧中的 Properties &#xff0c; 這篇文章是 他的補充。 【android bluetooth 框架分析 04】【bt-framework 層詳解 6】【Properties介紹】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一個 Java…

C盤瘦身?

突然發現回收站底部有橫幅辣眼睛&#xff01; 點擊深度清理跳轉C盤瘦身 點擊一鍵瘦身跳轉支付 回收站右鍵還有菜單 回收站右鍵可以通過設置關閉 回收站底部橫幅關不了&#xff01; 流氓沒人管了嗎&#xff1f;

用戶通知服務,輕松實現應用與用戶的多場景交互

用戶在使用應用時&#xff0c;經常想要了解應用程序在執行的操作&#xff0c;如下載完成、新郵件到達、發布即時的客服支付通知等&#xff0c;這些通知除了攜帶基本的文本圖片信息外&#xff0c;最好還可以支持文件上傳下載進度場景下的進度條通知&#xff0c;以及點擊通知欄可…

蘋果獲智能錢包專利,Find My生態版圖或再擴張:錢包會“說話”還能防丟

蘋果公司近日成功獲批一項突破性專利&#xff0c;揭示了一種支持Find My網絡的全新智能錢包設計方案。該錢包不僅能智能管理用戶的信用卡、身份證等實體卡片&#xff0c;更具備了追蹤定位和通過揚聲器發聲提醒的能力&#xff0c;有望成為蘋果“查找”&#xff08;Find My&#…

當機床開始“思考”,傳統“制造”到“智造”升級路上的法律暗礁

——首席數據官高鵬律師團隊創作&#xff0c;AI輔助 一、被時代推著走的工廠&#xff1a;從“鐵疙瘩”到“智能體”的陣痛 某汽車零部件廠的李廠長至今記得三年前的凌晨。為了趕上新能源車企的訂單&#xff0c;廠里咬牙引進了兩條智能生產線&#xff0c;可調試第三天&#xff…

概率基礎——不確定性的數學

第05篇&#xff1a;概率基礎——不確定性的數學 寫在前面&#xff1a;大家好&#xff0c;我是藍皮怪&#xff01;前幾篇我們聊了統計學的基本概念、數據類型、描述性統計和數據可視化&#xff0c;今天我們要進入統計學的另一個重要基礎——概率論。你有沒有想過&#xff0c;為什…

爬蟲遇到base64編碼(非常規版)

一.特征 從 Base64 的核心特性入手&#xff0c;比如它的編碼原理&#xff08;將二進制數據轉換為 ASCII 字符集&#xff09;和字符集的組成&#xff08;A-Z、a-z、0-9、、/ 和 &#xff09;。這是 Base64 最基礎的特點&#xff0c;幾乎每個回答都應該包括這些內容。基于 64 個…