Spring Boot實現異常處理

Spring Boot 提供了多種靈活的方式實現異常處理,以下是核心方案和最佳實踐:


一、基礎異常處理方案

1. @ControllerAdvice + @ExceptionHandler(全局處理)
@ControllerAdvice
public class GlobalExceptionHandler {// 處理特定異常(如業務異常)@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {ErrorResponse error = new ErrorResponse(ex.getCode(), ex.getMessage());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}// 處理所有未捕獲異常@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {ErrorResponse error = new ErrorResponse("500", "服務器內部錯誤");return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}
}// 自定義錯誤響應體
@Data
class ErrorResponse {private String code;private String message;// 可擴展時間戳、路徑等字段
}

作用

  • 捕獲控制器層拋出的所有異常,返回結構化錯誤信息
  • 支持區分異常類型定制HTTP狀態碼和響應體
2. @ResponseStatus(簡單場景)
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "資源不存在")
public class ResourceNotFoundException extends RuntimeException {// 自動返回404狀態碼和指定消息
}

二、REST API 增強處理

1. 自定義錯誤數據結構
{"timestamp": "2025-06-22T10:00:00","status": 404,"error": "Not Found","path": "/api/users/999"
}

通過繼承 DefaultErrorAttributes 可擴展字段:

@Component
public class CustomErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(...) {Map<String, Object> map = super.getErrorAttributes(...);map.put("traceId", UUID.randomUUID().toString()); // 添加追蹤IDreturn map;}
}
2. OpenAPI/Swagger 集成

@ControllerAdvice 中補充注解:

@Operation(responses = {@ApiResponse(responseCode = "400", description = "業務參數錯誤"),@ApiResponse(responseCode = "500", description = "系統內部錯誤")
})

三、特殊場景處理

1. 校驗異常處理(Validation)

自動捕獲 MethodArgumentNotValidException

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationExceptions(MethodArgumentNotValidException ex) {String errorMsg = ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(", "));return new ResponseEntity<>(new ErrorResponse("400", errorMsg), HttpStatus.BAD_REQUEST);
}
2. Servlet 容器級錯誤

配置 ErrorController 處理404等底層錯誤:

@RestController
public class CustomErrorController implements ErrorController {@RequestMapping("/error")public ResponseEntity<ErrorResponse> handleError(HttpServletRequest request) {Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");return new ResponseEntity<>(new ErrorResponse(status.toString(), "請求路徑不存在"), HttpStatus.valueOf(status));}
}

四、最佳實踐建議

  1. 分層處理

    • 業務層拋出自定義異常(如 OrderNotFoundException
    • 控制器層專注參數校驗和流程控制
    • 全局處理器統一轉換異常為響應
  2. 日志記錄
    @ExceptionHandler 中記錄錯誤堆棧:

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex, HttpServletRequest request) {log.error("Request {} failed: {}", request.getRequestURI(), ex.getMessage(), ex);// ...返回響應
    }
    
  3. 前端友好
    返回標準化錯誤碼(如 1001=用戶不存在),便于前端識別處理。


五、完整項目結構示例

src/main/java/
├── exception/
│   ├── GlobalExceptionHandler.java  # 全局處理器
│   ├── BusinessException.java       # 自定義業務異常
│   └── ErrorResponse.java           # 錯誤響應體
└── config/└── CustomErrorAttributes.java   # 錯誤屬性擴展

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

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

相關文章

【目標檢測】IOU的概念與Python實例解析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官網地址&#xff1a;vue-print-nb - npm 1.安裝 npm install vue-print-nb --save 2.導入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置參數 4.頁面使用 <div id"printDiv">打印內容</div><el-button v-print&…

Matplotlib快速入門

目錄 基本使用 解決中文亂碼 一個坐標系繪制多個圖像 多個坐標系繪制 基本使用 什么是Matplotlib 是專門用于開發2D圖表(包括3D圖表)以漸進&#xff0c;交互式方式實現數據可視化 為什么要學習matplotlib 可視化是在整個數據挖掘的關鍵輔助工具&#xff0c;可以清晰的理解…

扣料不允許‘貨物移動’

遇到了報錯&#xff0c;不允許貨物移動 以為又是和之前一樣是訂單已經關閉&#xff0c;看是領錯料還是財務誤關的原因&#xff0c;但是co03一看訂單狀態并沒有關閉 原因就是這個CRTD 訂單只是創建了&#xff0c;但是沒有下達 找個正常的看看&#xff1a; 一般訂單創建和下達都…

【AI】全新AI測試系列之二--------AI自動化測試,提高測試效率

目錄 一、自動化測試 1、與手動測試對比 2、自動化測試流程 二、自動化測試環境搭建 三、web自動化使用AI的兩種方式 1、利用DeepSeek快速生成腳本 2、pycharm集成通義靈碼 四、通義靈碼實戰 1、使用提示詞生成代碼 2、使用pytest框架 前言&#xff1a;上一章節只要是…

npm包沖突install失敗

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一個命令行選項&#xff0c;主要用于解決依賴沖突問題。當安裝依賴時&#xff0c;npm默認會嚴格檢查peer dependencies&#xff08;對等依賴&#xff09;的版本兼容性&#xff0c;可能導致安裝失敗。啟用此選…

68、數據訪問-crud實驗-刪除用戶完成

68、數據訪問-crud實驗-刪除用戶完成 以下是完成“數據訪問-CRUD實驗-刪除用戶”功能的一般步驟&#xff0c;以常見Web應用框架&#xff08;如Spring Boot MyBatis-Plus、Django、Ruby on Rails&#xff09;為例&#xff1a; #### 準備工作 - **數據庫表設計**&#xff1a;確…

實現 TurtleBot3 多點軌跡跟蹤導航

系統架構 move_base本身不支持一次性發送多個目標點并自動按順序導航,使用nav_msgs/Path消息類型發布多個路徑點,然后讓機器人按順序依次到達每個路徑點。 發布一個包含多個路徑點的Path消息(可選,用于在RVIZ中顯示路徑)。按順序將每個路徑點作為MoveBaseGoal發送給move_…

《人性的優點》:破解憂慮密碼,構建積極人生

我強烈推薦4本可以改變命運的經典著作&#xff1a; 《壽康寶鑒》在線閱讀白話文《欲海回狂》在線閱讀白話文《陰律無情》在線閱讀白話文《了凡四訓》在線閱讀白話文 一、世界觀&#xff1a;憂慮的本質與生命的真相 &#xff08;一&#xff09;憂慮是精神的“虛構苦難” 卡耐基…

D2554探鴿協議,sensor屬性,回調

D2554探鴿協議&#xff0c;sensor屬性&#xff0c;回調 各屬性的默認值 對比度&#xff1a; 0x4064&#xff08;10進制&#xff09; 清晰度、銳度&#xff1a; 0x000&#xff08;10進制&#xff09; 飽和度&#xff1a; …

.NET 4.7中使用NLog記錄日志到數據庫表

1. 首先安裝必要的NuGet包 在項目中安裝以下NuGet包&#xff1a; NLog NLog.Config (可選&#xff0c;用于自動生成配置文件) 相應的數據庫提供程序&#xff08;如System.Data.SqlClient for SQL Server&#xff09; Install-Package NLog Install-Package NLog.Config In…

非對稱加密實戰:Python實現數字簽名

目錄 非對稱加密實戰&#xff1a;Python實現數字簽名引言&#xff1a;數字世界的身份驗證1. 非對稱加密基礎1.1 核心概念1.2 非對稱加密算法比較 2. 數字簽名原理2.1 數字簽名工作流程2.2 數字簽名的核心特性 3. RSA數字簽名實現3.1 RSA算法數學基礎3.1.1 密鑰生成3.1.2 簽名生…

優化提示詞的常用技巧

優化提示詞的常用技巧 1. 告訴AI你需要的重要要素 &#xff08;1&#xff09;風格&#xff1a;明確語言風格 優化前&#xff1a;寫一篇人工智能的介紹。優化后&#xff1a;寫一篇100字的人工智能介紹&#xff0c;受眾是小學生&#xff0c;語言幽默。 &#xff08;2&#xf…

PyTorch實戰(12)——StyleGAN詳解與實現

PyTorch實戰(12)——StyleGAN詳解與實現 0. 前言1. StyleGAN1.1 模型介紹1.2 模型策略分析2. 實現 StyleGAN2.1 生成圖像2.2 風格遷移小結系列鏈接0. 前言 StyleGAN (Style-Generative Adversarial Networks) 是生成對抗網絡 (Generative Adversarial Networks, GAN) 的變體…

XML重復查詢一條Sql語句??怎么解決

一、核心問題&#xff1a;從SQL重復執行到日志失效 1. 首要現象&#xff1a;XML重復查詢失效 在排查服務性能時發現&#xff1a; <!-- MyBatis XML片段 --> <select id"List" resultMap"Map"> SELECT * FROM user WHERE name #{name} …

量化面試綠皮書:33. 不公平的硬幣

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 33. 不公平的硬幣 你有1000枚硬幣。 其中&#xff0c;有1枚硬幣正反兩面都是正面。 其他的999枚硬幣都是公平的硬幣。 你隨機選擇一枚硬幣并…

Java 期末考試題

1. 如果將類 MyClass 聲明為 public&#xff0c;它的文件名必須是 ( ) 才能正常編譯。 解&#xff1a;① 如果一個類被聲明為 public&#xff0c;則必須以 .java 作為文件拓展名。 答案&#xff1a;MyClass.java 2. 定義類頭時能使用的修飾符是&#xff08; &#xff09;…

跨標簽頁通信(三):Web Storage

在現代 Web 應用中&#xff0c;跨標簽頁通信的需求越來越普遍。無論是實現多標簽頁之間的數據同步&#xff0c;還是構建實時協作功能&#xff0c;跨標簽頁通信都能極大地提升用戶體驗。今天&#xff0c;我們將探討一種簡單而高效的實現方式&#xff1a;Web Storage。 一、什么…

大疆上云api 無人機攝像頭紅外調色模式

# topic thing/product/{你的機場}/property/set# 監聽topic&#xff0c;獲取設置結果 thing/product//property/set_reply#mqtt https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/dock-to-cloud/mqtt/aircraft/m3d-properties.htmlthermal_current_palet…

DeepSeek與ChatGPT:免費與付費背后的選擇邏輯

內容簡介&#xff1a; 為什么有免費的DeepSeek&#xff0c;很多人還在付費用ChatGPT&#xff1f;作為20年互聯網老兵&#xff0c;作者通過實測發現&#xff1a;AI工具好壞七成看你怎么跟它聊天。DeepSeek不是真的不如ChatGPT&#xff0c;而是需要掌握"撩AI"的技巧。文…