spring mvc 異常處理中@RestControllerAdvice 和 @ControllerAdvice 對比詳解

@RestControllerAdvice 和 @ControllerAdvice 對比詳解


1. 基本概念
注解等效組合核心作用
@ControllerAdvice@Component + @RequestMapping(隱式)定義全局控制器增強類,處理跨控制器的異常、數據綁定或全局響應邏輯。
@RestControllerAdvice@ControllerAdvice + @ResponseBody繼承 @ControllerAdvice,并默認將返回值序列化為 HTTP 響應體(如 JSON)。

2. 核心區別
對比維度@ControllerAdvice@RestControllerAdvice
返回值處理默認返回視圖名稱(需配合 @ResponseBody 才能序列化)直接返回數據對象,自動序列化為響應體(如 JSON)
適用場景傳統 MVC 應用(如返回 HTML 視圖或混合響應)RESTful API(需返回 JSON/XML 格式數據)
注解組合需手動添加 @ResponseBody 才能返回 JSON內置 @ResponseBody,無需額外聲明
返回類型示例String(視圖名稱)、ModelAndViewResponseEntity, Map, 自定義 POJO

3. 代碼示例對比
場景:全局異常處理

@ControllerAdvice 示例(返回視圖名稱)

@ControllerAdvice
public class GlobalViewExceptionHandler {@ExceptionHandler(IOException.class)public String handleIOException() {return "error/500"; // 返回視圖名稱(如 Thymeleaf 模板)}
}

@RestControllerAdvice 示例(返回 JSON)

@RestControllerAdvice
public class GlobalApiExceptionHandler {@ExceptionHandler(IOException.class)public ResponseEntity<ErrorDetails> handleIOException() {ErrorDetails error = new ErrorDetails(500, "Internal Server Error", null);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);}
}

4. 關鍵功能對比
功能@ControllerAdvice@RestControllerAdvice
異常處理支持,需手動定義返回類型(視圖或 JSON)支持,直接返回 JSON 格式錯誤對象
數據綁定可通過 @InitBinder 統一配置綁定規則同樣支持 @InitBinder,但返回值默認序列化
全局方法增強可通過 @ModelAttribute 注入公共數據同樣支持,但返回數據自動序列化
響應體控制需顯式使用 @ResponseBodyResponseEntity內置 @ResponseBody,無需額外聲明

5. 配置與擴展
共同特性
  • 包級作用域:通過 basePackages 指定需要增強的控制器包:

    @ControllerAdvice(basePackages = "com.example.controllers")
    
  • 方法級過濾:通過 annotations 指定僅處理特定注解的控制器:

    @ControllerAdvice(annotations = RestController.class)
    
差異點
  • 響應體格式
    • @ControllerAdvice 需顯式配置 @ResponseBodyResponseEntity 才能返回 JSON:

      @ControllerAdvice
      public class MixHandler {@ResponseBody // 顯式聲明返回 JSON@ExceptionHandler(IOException.class)public ErrorDetails handleIOException() { ... }
      }
      
    • @RestControllerAdvice 默認支持序列化:

      @RestControllerAdvice
      public class ApiHandler {@ExceptionHandler(IOException.class)public ErrorDetails handleIOException() { ... } // 自動序列化為 JSON
      }
      

6. 典型使用場景
場景推薦注解原因
傳統 Web 應用(返回 HTML)@ControllerAdvice需返回視圖名稱(如 Thymeleaf 模板路徑)。
RESTful API 異常處理@RestControllerAdvice直接返回結構化的 JSON 錯誤信息,無需額外配置 @ResponseBody
混合場景(需同時處理視圖和 JSON)@ControllerAdvice需通過 @ResponseBody 區分返回類型,或使用 ResponseEntity 控制響應格式。

7. 總結表格
維度@ControllerAdvice@RestControllerAdvice
核心作用全局異常處理、數據綁定、視圖增強專為 REST API 設計,返回 JSON 格式響應
返回值默認行為返回視圖名稱或需 @ResponseBody 顯式聲明直接返回數據對象,自動序列化為響應體
適用場景傳統 MVC 應用、混合響應場景純 REST API 開發(如 Spring Boot 微服務)
注解組合關系獨立注解,需手動配置響應格式等效于 @ControllerAdvice + @ResponseBody

關鍵總結

  1. 選擇原則
    • REST API:優先使用 @RestControllerAdvice,簡化 JSON 響應處理。
    • 傳統 MVC:使用 @ControllerAdvice,靈活控制視圖或 JSON 響應(需配合 @ResponseBody)。
  2. 注意事項
    • @ControllerAdvice 若需返回 JSON,必須顯式添加 @ResponseBody 或使用 ResponseEntity
    • @RestControllerAdvice 內置 @ResponseBody,無需額外聲明,適合統一 API 響應格式。
  3. 最佳實踐
    • 對于純 API 項目,用 @RestControllerAdvice 集中處理異常和響應。
    • 在混合項目中,通過 basePackages 區分不同場景的增強類。

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

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

相關文章

JavaScript的回調函數:異步編程的基石

引言 在JavaScript的世界里&#xff0c;回調函數是一種強大而基礎的編程模式&#xff0c;它是異步編程的核心概念之一。隨著Web應用程序變得越來越復雜&#xff0c;理解和掌握回調函數變得尤為重要。本文將深入探討JavaScript回調函數的概念、應用場景以及最佳實踐。 什么是回…

測試用例 [軟件測試 基礎]

目錄 測試用例 1. 概念 1.1 什么是測試用例 1.2 什么是要素 1.3 為什么需要測試用例 2. 設計測試用例的萬能公式 2.1 常規思維 逆向思維 發散性思維 2.2 萬能公式 3. 設計測試用例的方法 3.1 基于需求的設計方法 3.2 具體的設計方法 3.3 更多用例練習 測試用例 …

Jupyter notebook定制字體

一、生成配置文件 運行Anaconda Powershell Prompt終端&#xff0c;輸入下面一行代碼&#xff1a; jupyter notebook --generate-config 將生成文件“C:\Users\XXX\.jupyter\jupyter_notebook_config.py”&#xff0c;XXX為計算機賬戶名字。 二、修改配置文件 c.NotebookAp…

miniconda安裝R語言圖文教程(詳細步驟)

本篇教程介紹,如何在Windows使用miniconda安裝R語言。 一、創建1個conda 虛擬環境 # 創建虛擬環境 conda create -n r_env # 激活虛擬環境 conda activate r_env二、安裝 R 語言 conda install -c r r-ggplot2三、運行測試 檢查安裝: 輸入 R 進入 R 的交互式命令行,檢查是…

【day1】AI軟件測試學習筆記

以下為整理的 AI軟件測試學習筆記&#xff0c;涵蓋性能測試工具鏈、AI大模型應用及開發實踐&#xff0c;分為四大模塊&#xff1a; 一、性能測試工具鏈與數據分析 1. 工具鏈整合效果 JMeter InfluxDB Grafana JMeter壓測數據存儲至云端InfluxDB&#xff0c;實現分布式壓測和…

WPF 資源加載問題:真是 XAML 的鍋嗎?

你的觀察很敏銳&#xff01;確實&#xff0c;在 WPF 項目中&#xff0c;.cs 文件主要負責邏輯實現&#xff0c;而資源加載的問題通常跟 XAML&#xff08;以及它背后的 .csproj 配置&#xff09;關系更大。我會圍繞這個觀點&#xff0c;用 CSDN 博客風格詳細解釋一下 .cs、XAML …

C++17模板編程與if constexpr深度解析

一、原理深化 1.1 模板編程 1.1.1 編譯器如何處理模板&#xff08;補充&#xff09; 模板的實例化機制存在兩種模式&#xff1a; 隱式實例化&#xff1a;編譯器在遇到模板具體使用時自動生成代碼&#xff0c;可能導致多翻譯單元重復實例化&#xff0c;增加編譯時間。顯式實…

408 計算機網絡 知識點記憶(6)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容&#xff0c;系統梳理核心知識記憶點和框架&#xff0c;既為個人復習沉淀思考&#xff0c;亦希望能與同行者互助共進。&#xff08;PS&#xff1a;后續將持續迭代優化細節&#xff09; 往期內容 408 計算機網絡 知識…

MySQL學習筆記十四

第十六章創建高級聯結 16.1使用表別名 輸入&#xff1a; SELECT CONCAT(vend_name,(,RTRIM(vend_country),)) AS vend_title FROM vendors ORDER BY vend_name; 輸出&#xff1a; 輸入&#xff1a; SELECT cust_name, cust_contact FROM customers AS c, orders AS o, or…

Spring MVC 框架 的核心概念、組件關系及流程的詳細說明,并附表格總結

以下是 Spring MVC 框架 的核心概念、組件關系及流程的詳細說明&#xff0c;并附表格總結&#xff1a; 1. 核心理念 Spring MVC 是基于 MVC&#xff08;Model-View-Controller&#xff09;設計模式 的 Web 框架&#xff0c;其核心思想是 解耦&#xff1a; Model&#xff1a;數…

Android里藍牙使用流程以及問題詳解

一、基礎流程 請簡述 Android 藍牙開發的基本流程 1. 權限處理&#xff1a;動態申請藍牙和定位權限&#xff08;注意Android 12新權限&#xff09; 2. 初始化藍牙適配器&#xff1a;通過BluetoothManager獲取BluetoothAdapter 3. 設備發現&#xff1a;- 注冊BroadcastReceive…

OpenWrt 上安裝Tailscale

在 OpenWrt 上安裝 Tailscale 非常簡單&#xff0c;主要步驟如下&#xff1a; 1. 確保 OpenWrt 設備可聯網 首先&#xff0c;確保你的 OpenWrt 設備已經聯網&#xff0c;可以訪問外網&#xff0c;并且 SSH 進入你的路由器&#xff08;通常是 192.168.1.1&#xff09;&#xff…

藍橋杯刷題總結 + 應賽技巧

當各位小伙伴們看到這篇文章的時候想必藍橋杯也快開賽了&#xff0c;那么本篇文章博主就來總結一下一些藍橋杯的應賽技巧&#xff0c;那么依舊先來走個流程 那么接下來我們分成幾個板塊進行總結 首先是一些基本語法 編程語言的基本語法 首先是數組&#xff0c;在存數據的時候…

TCP重傳率高與傳輸延遲問題

目錄標題 排查步驟&#xff1a;TCP重傳率高與傳輸延遲問題v1.0通過 rate(node_netstat_Tcp_RetransSegs[3m]) 排查 TCP 重傳問題的步驟1. **指標含義與初步分析**2. **關聯指標排查**3. **定位具體問題源**4. **解決方案**5. **驗證與監控** v2.0一、基礎檢查二、網絡層分析三、…

【LeetCode 熱題100】73:矩陣置零(詳細解析)(Go語言版)

&#x1f680; 力扣熱題 73&#xff1a;矩陣置零&#xff08;詳解 多種解法&#xff09; &#x1f4cc; 題目描述 給定一個 m x n 的整數矩陣 matrix&#xff0c;如果一個元素為 0&#xff0c;則將其所在行和列的所有元素都設為 0。請你 原地 使用常量空間解決。 &#x1f3a…

組播網絡構建:IGMP、PIM 原理及應用實踐

IP組播基礎 組播基本架構 組播IP地址 一個組播IP地址并不是表示具體的某臺主機&#xff0c;而是一組主機的集合&#xff0c;主機聲明加入某組播組即標識自己需要接收目的地址為該組播地址的數據IP組播常見模型分為ASM模型和SSM模型ASM&#xff1a;成員接收任意源組播數據&…

Unity UGUI使用手冊

概述 UGUI(Unity Graphical User Interface) :Unity 圖像用戶界面 在游戲開發中&#xff0c;我們經常需要搭建一些圖形用戶界面。Unity內置的UGUI可以幫助開發者可視化地拼接界面&#xff0c;提高開發效率。UGUI提供不同樣式的UI組件&#xff0c;并且封裝了對應功能的API&am…

Python web程序在服務器上面部署詳細步驟

在服務器上部署Python web程序通常涉及以下步驟&#xff1a; 設置服務器環境: 選擇合適的服務器&#xff0c;如AWS EC2、DigitalOcean Droplet等。配置服務器操作系統&#xff0c;例如Ubuntu、CentOS等。安裝必要的軟件&#xff0c;如Python、pip、git等。 準備Python web程序…

條件生成對抗網絡(Conditional GAN, CGAN)原理及實現(pytorch版)

CGAN 原理及實現 一、CGAN 原理1.1 基本概念1.2 與傳統GAN的區別1.3 目標函數1.4 損失函數1.5 條件信息的融合方式1.6 與其他GAN變體的對比1.7 CGAN的應用1.8 改進與變體 二、CGAN 實現2.1 導包2.2 數據加載和處理2.3 構建生成器2.4 構建判別器2.5 訓練和保存模型2.6 繪制訓練損…

Go語言比較遞歸和循環執行效率

一、概念 1.遞歸 遞歸是指一個函數在其定義中直接或間接調用自身的編程方法 。簡單來說&#xff0c;就是函數自己調用自己。遞歸主要用于將復雜的問題分解為較小的、相同類型的子問題&#xff0c;通過不斷縮小問題的規模&#xff0c;直到遇到一個最簡單、最基礎的情況&#x…