spring mvc中不同服務調用類型(聲明式(Feign)、基于模板(RestTemplate)、基于 SDK、消息隊列、gRPC)對比詳解

@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. 什么是聲明式服務調用?

定義:通過注解或配置聲明服務調用接口,無需手動編寫底層網絡請求代碼,由框架自動生成代理實現。
核心特點

  • 聲明式:通過注解(如 @FeignClient)或配置定義服務接口。
  • 自動代理:框架(如 Spring Cloud Feign)自動處理 HTTP 請求、序列化、負載均衡等。
  • 解耦:開發者只需關注業務邏輯,無需關心網絡細節。

示例(Spring Cloud Feign):

@FeignClient(name = "service-provider") // 聲明調用的服務名稱
public interface ProductClient {@GetMapping("/products/{id}")Product getProduct(@PathVariable("id") String id);
}

2. 其他服務調用類型及對比

類型 1:基于模板的調用(如 RestTemplate/HttpClient)

定義:手動構造 HTTP 請求,通過模板工具(如 RestTemplateOkHttp)發送請求并處理響應。
特點

  • 靈活控制:可完全控制請求參數、超時、重試等。
  • 無侵入性:無需框架支持,純 Java 實現。
  • 代碼冗長:需手動處理異常、序列化等。

使用方法

// 使用 RestTemplate 調用服務
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Product> response = restTemplate.getForEntity("http://service-provider/products/123",Product.class
);
Product product = response.getBody();

類型 2:基于 SDK 的調用

定義:通過第三方或自定義 SDK 封裝服務調用邏輯,提供統一接口。
特點

  • 封裝復雜邏輯:如 AWS SDK 封裝了 S3、DynamoDB 的調用細節。
  • 依賴性強:需引入 SDK 依賴,版本需與服務端兼容。
  • 易用性高:開發者無需關心底層協議。

使用示例(AWS S3 SDK)

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion("us-west-2").build();
S3Object object = s3Client.getObject("my-bucket", "key-name");

類型 3:基于消息隊列的異步調用

定義:通過消息中間件(如 RabbitMQ、Kafka)發送異步消息,由消費者處理。
特點

  • 解耦:生產者與消費者無直接依賴。
  • 異步:支持高并發和最終一致性。
  • 需消息中間件:需維護消息隊列基礎設施。

使用示例(Spring Cloud Stream)

// 生產者發送消息
@Service
public class OrderService {@Autowiredprivate MessageChannel orderChannel;public void sendOrder(Order order) {orderChannel.send(MessageBuilder.withPayload(order).build());}
}// 消費者處理消息
@Service
public class OrderConsumer {@StreamListener("order-inbound")public void processOrder(Order order) {// 處理訂單邏輯}
}

類型 4:基于 gRPC 的調用

定義:使用 gRPC 框架進行高性能的 RPC 調用,基于 Protocol Buffers 定義接口。
特點

  • 高性能:二進制協議,支持流式傳輸。
  • 強類型定義:通過 .proto 文件定義接口和數據結構。
  • 學習成本高:需掌握 gRPC 和 Protocol Buffers。

使用示例

// 定義 proto 文件
service ProductService {rpc GetProduct (ProductRequest) returns (ProductResponse) {}
}// 生成客戶端代碼
ProductServiceBlockingStub stub = ProductGrpc.newBlockingStub(channel);
ProductResponse response = stub.getProduct(request);

類型 5:基于 HTTP 客戶端(如 OkHttp)的直接調用

定義:直接使用低層 HTTP 客戶端(如 OkHttp、URLConnection)發送請求。
特點

  • 完全控制:可配置超時、連接池等。
  • 無需框架依賴:純 Java 實現。
  • 代碼復雜度高:需手動處理序列化、異常等。

示例(OkHttp)

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://service-provider/products/123").build();
Response response = client.newCall(request).execute();
String responseBody = response.body().string();

3. 對比總結表格
類型聲明式基于模板基于 SDK消息隊列gRPC
核心特點注解聲明,框架代理手動構造請求封裝第三方接口異步解耦高性能 RPC
代碼復雜度簡單(無需手動請求)中等(需處理細節)簡單(依賴 SDK)中等(需消息配置)高(需 proto 定義)
適用場景微服務內同步調用需靈活控制的場景第三方服務調用解耦異步場景高性能同步 RPC
框架依賴Spring Cloud無(需 RestTemplate)SDK 依賴RabbitMQ/KafkagRPC 庫
是否同步/異步同步(可配置異步)同步/異步同步/異步異步同步/異步流
典型工具FeignRestTemplate,OkHttpAWS SDKSpring Cloud StreamgRPC

4. 選擇依據
需求場景推薦類型原因
快速集成微服務同步調用聲明式(Feign)零代碼實現負載均衡、熔斷,開發效率高。
需靈活控制 HTTP 請求細節基于模板(RestTemplate)直接控制超時、重試等參數。
調用第三方服務(如 AWS)基于 SDK使用官方 SDK 確保兼容性和易用性。
解耦服務間依賴消息隊列異步通信,高并發場景下避免阻塞。
高性能低延遲的 RPC 調用gRPC二進制協議和流式傳輸適合高頻、低延遲場景。

5. 關鍵總結
  1. 聲明式服務調用(如 Feign):開發效率最高,適合微服務內同步調用。
  2. 基于模板/SDK靈活性與易用性平衡,適合復雜或第三方服務調用。
  3. 消息隊列解耦與異步的首選方案。
  4. gRPC高性能場景的最優選擇,需權衡學習成本。

根據項目需求(如性能、耦合度、開發效率),選擇合適的調用方式,或混合使用多種類型以滿足不同場景。

  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/news/900887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900887.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900887.shtml

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

相關文章

CVE-2025-29927 Next.js 中間件鑒權繞過漏洞

Next.js Next.js 是一個基于 React 的現代 Web 開發框架&#xff0c;用來構建高性能、可擴展的 Web 應用和網站。 CVE-2025-29927 Next.js 中間件鑒權繞過漏洞 CVE-2025-29927是Next.js框架中的一個授權繞過漏洞&#xff0c;允許攻擊者通過特制的HTTP請求繞過在中間件中執行…

WP最主題專業的wordpress主題開發

WP最主題&#xff08;wpzui.com&#xff09; WP最主題是一個提供高品質WordPress主題的平臺。它注重主題的設計和功能&#xff0c;旨在為用戶提供美觀且實用的主題選擇。其主題通常具有良好的用戶體驗、豐富的自定義選項以及優化的性能&#xff0c;能夠滿足不同類型的網站搭建…

玩轉代理 IP :實戰爬蟲案例

在現代互聯網環境下&#xff0c;爬蟲不僅是數據獲取的利器&#xff0c;也成為應對網站反爬機制的技術博弈。而在這場博弈中&#xff0c;"代理 IP" 是核心武器之一。本文將以高匿名的代理ip為核心&#xff0c;結合 Python 實戰、代理策略設計、高匿技巧與反封鎖優化&a…

Vue 3 中 ref 與 reactive 的對比

Vue 3 中 ref 與 reactive 的對比 Vue 3 中 ref 與 reactive 的對比一、定義和基本使用refreactive 二、響應式原理refreactive 三、適用場景refreactive 四、注意事項refreactive Vue 3 中 ref 與 reactive 的對比 在 Vue 3 中&#xff0c;ref 和 reactive 都是用于創建響應式…

《Vue.js組件化開發實戰:從安全縱深到性能躍遷》

開篇&#xff1a;組件化開發的工業革命 當全球500強企業的核心業務系統在12.12大促中經受每秒38萬次請求沖擊時&#xff0c;我們突然意識到&#xff1a;現代前端組件已不再是簡單的UI積木&#xff0c;而是承載業務邏輯、安全防護、性能優化的納米級作戰單元。本文將從軍工級系統…

從0到1的Python接口自動化學習路線

Python 是一門非常適合初學者且功能強大的編程語言,它在接口自動化測試領域具有廣泛應用。 以下是一份針對 Python 與接口自動化測試的詳細學習路線,幫助你從零開始學習并逐步掌握相關知識。 第一階段:Python基礎 目標:掌握 Python 基本語法和編程能力。 一、學習內容 1.…

HDCP(五)

HDCP 2.2 測試用例設計詳解 基于HDCP 2.2 CTS v1.1規范及協議核心機制&#xff0c;以下從正常流程與異常場景兩大方向拆解測試用例設計要點&#xff0c;覆蓋認證、密鑰管理、拓撲驗證等關鍵環節&#xff1a; 1. 正常流程測試 1.1 單設備認證 ? 測試目標&#xff1a;驗證源設…

國標GB28181協議EasyCVR視頻融合平臺:5G時代遠程監控賦能通信基站安全管理

一、背景介紹 隨著移動通信行業的迅速發展&#xff0c;無人值守的通信基站建設規模不斷擴大。這些基站大多建于偏遠地區&#xff0c;周邊人跡罕至、交通不便&#xff0c;給日常的維護帶來了極大挑戰。其中&#xff0c;位于空曠地帶的基站設備&#xff0c;如空調、蓄電池等&…

A2L文件解析

目錄 1 摘要2 A2L文件介紹2.1 A2L文件作用2.2 A2L文件格式詳解2.2.1 A2L文件基本結構2.2.2 關鍵元素與聲明2.2.3 完整A2L文件示例 3 總結 1 摘要 A2L文件&#xff08;也稱為ASAP2文件&#xff09;是ECU開發的核心接口文件&#xff0c;用于標定、測量和診斷的關鍵配置文件&…

光學工程考研調劑推薦

一、調劑院校推薦 1. 華南農業大學 ? 調劑分數參考&#xff1a;光學工程調劑生分數通常在300分左右&#xff0c;過國家線即可嘗試。例如&#xff0c;2023年有297分考生成功調劑至此。 ? 優勢&#xff1a;對分數要求相對寬松&#xff0c;適合分數接近國家線的考生。 2. 安…

SQLite 注入:深入理解與防范策略

SQLite 注入:深入理解與防范策略 引言 SQLite,作為一款輕量級的數據庫,被廣泛應用于嵌入式系統、移動應用以及個人電腦中。盡管SQLite以其簡單易用而受到青睞,但其安全機制若不恰當配置,則可能面臨注入攻擊的風險。本文旨在深入探討SQLite注入的原理、類型及防范策略。 …

汽車與航空航天領域軟件維護:深度剖析與未來展望

一、引言 在當今科技飛速發展的時代&#xff0c;汽車和航空航天領域的軟件應用愈發廣泛和深入&#xff0c;軟件已成為這些行業系統的核心組成部分。從汽車的智能駕駛輔助系統到航空航天飛行器的飛行控制軟件&#xff0c;軟件的可靠性、安全性直接關系到整個系統的正常運行和人…

Jupyter notebook使用技巧

一、打開指定文件夾 在快捷方式目標中&#xff0c;使用如下代碼 anaconda3\python.exe anaconda3\cwp.py anaconda3 anaconda3\python.exe anaconda3\Scripts\jupyter-notebook-script.py --notebook-dirD:\code\python

車輛視頻檢測器linux版對于密碼中包含敏感字符的處理方法

由于密碼中含有敏感字符&#xff0c;導致前端頁面異常&#xff0c;圖標變灰&#xff0c;坐標拾取打不開圖像等&#xff0c;主要原因是&#xff1a;密碼比較前后不一致&#xff0c;左邊是Abc_110&#xff0c;右邊是&#xff1a;Abc_110%2B&#xff0c;對于此問題&#xff0c;特別…

移動端六大語言速記:第12部分 - 測試與優化

移動端六大語言速記:第12部分 - 測試與優化 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在測試與優化方面的特性,幫助開發者理解和掌握各語言的測試框架和性能優化技巧。 12. 測試與優化 12.1 單元測試框架對比 各語言單元測試框架…

Java—HTML:3D形變

今天我要介紹的是在Java HTML中CSS的相關知識點內容之一&#xff1a;3D形變&#xff08;3D變換&#xff09;。該內容包含透視&#xff08;屬性&#xff1a;perspective&#xff09;&#xff0c;3D變換&#xff0c;3D變換函數以及案例演示&#xff0c; 接下來我將逐一介紹&…

模擬-與-現實協同訓練:基于視覺機器人操控的簡單方法

25年3月來自 UT Austin、Nvidia、UC Berkeley 和紐約大學的論文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。 大型現實世界機器人數據集在訓練通才機器人模型方面擁有巨大潛力&#xff0c;但擴展現實世界人類數據收集既耗時又耗資…

電子電氣架構 --- 為配備區域計算的下一代電子/電氣(E/E)架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

【UE】漸變框材質

效果 步驟 新建一個材質&#xff0c;這里命名為“M_GlowingBorder”&#xff0c;打開“M_GlowingBorder”后&#xff0c;設置材質域為“用戶界面”&#xff0c;混合模式為“半透明” 添加如下節點&#xff1a; 代碼&#xff1a; Begin Object Class/Script/UnrealEd.Materia…

CTF web入門之爆破

爆破 web21: 打開burp進行抓包 通過對密碼進行解析。得知密碼是由拼接而來 admin:1 選擇要攻擊的參數 攻擊方式。 選擇payload方式 。。添加參數 1,2,3。賬號 分隔符 密碼 選擇加密方式。添加buse64.去掉url字符。不然buse64后,會在url加密過一次,從而導致攻擊不成…