Spring MVC 返回 JSON 視圖的方式及對比(6種)


Spring MVC 返回 JSON 視圖的方式及對比(新增 MappingJackson2JsonView


1. 方式一:@ResponseBody 注解
  • 作用:直接返回對象,由消息轉換器(如 Jackson)序列化為 JSON。

  • 適用場景:簡單返回對象,無需自定義 HTTP 狀態碼或頭信息。

  • 代碼示例

    @Controller
    public class UserController {@GetMapping("/user/json")@ResponseBodypublic User getUser() {return new User("John", 30); // 自動序列化為 JSON}
    }
    
  • 依賴:需引入 Jackson 庫(Spring Boot 默認已集成)。

  • 特點

    • 簡單直接,但需顯式標注 @ResponseBody
    • 無法直接控制 HTTP 狀態碼或頭信息。

2. 方式二:@RestController 注解
  • 作用:組合 @Controller@ResponseBody,所有方法默認返回 JSON。

  • 適用場景:RESTful API 控制器,所有方法均返回 JSON。

  • 代碼示例

    @RestController
    public class UserController {@GetMapping("/user/json")public User getUser() {return new User("John", 30); // 無需 @ResponseBody}
    }
    
  • 依賴:同 @ResponseBody

  • 特點

    • 簡化配置,類級別標注即可。
    • 所有方法默認返回 JSON,適合 REST API。

3. 方式三:ResponseEntity 對象
  • 作用:返回包裝對象,可自定義 HTTP 狀態碼、頭信息和響應體。

  • 適用場景:需要返回特定狀態碼(如 404、201)或自定義頭信息。

  • 代碼示例

    @RestController
    public class UserController {@GetMapping("/user/json")public ResponseEntity<User> getUser() {User user = new User("John", 30);return ResponseEntity.status(HttpStatus.CREATED).header("X-Custom-Header", "value").body(user);}
    }
    
  • 依賴:無需額外依賴。

  • 特點

    • 靈活性高,可控制狀態碼、頭和響應體。
    • 適合復雜響應場景。

4. 方式四:@JsonView 控制序列化字段
  • 作用:通過注解控制對象序列化的字段,避免暴露敏感數據。

  • 適用場景:需要根據場景選擇性序列化字段(如不同 API 版本)。

  • 代碼示例

    // 定義視圖類
    class Views {static class Public {} static class Internal extends Public {}
    }@RestController
    public class UserController {@JsonView(Views.Public.class)@GetMapping("/user/json/public")public User getPublicUser() {return new User("John", 30); // 只序列化 @JsonView(Views.Public) 的字段}@JsonView(Views.Internal.class)@GetMapping("/user/json/internal")public User getInternalUser() {return new User("John", 30); // 序列化 Public 和 Internal 的字段}
    }// User 類字段配置
    public class User {@JsonView(Views.Public.class)private String name;@JsonView(Views.Internal.class)private int age;// ...
    }
    
  • 依賴:Jackson 的 @JsonView 注解。

  • 特點

    • 精細控制序列化字段。
    • 適合不同接口暴露不同數據。

5. 方式五:@RequestBody 反序列化 + @ResponseBody 序列化
  • 作用:處理 POST/PUT 請求的 JSON 反序列化,同時返回 JSON。

  • 適用場景:需要雙向 JSON 交互(如 REST API)。

  • 代碼示例

    @RestController
    public class UserController {@PostMapping("/user/save")public User saveUser(@RequestBody User user) {// 反序列化 JSON 請求體到 User 對象return user; // 序列化為 JSON 響應}
    }
    
  • 依賴:Jackson。

  • 特點

    • 支持請求體反序列化和響應體序列化。
    • 適合 RESTful CRUD 操作。

6. 新增方式六:MappingJackson2JsonView
  • 作用:通過視圖解析器將模型數據轉換為 JSON 格式的視圖。

  • 適用場景:需要兼容舊代碼或特定視圖配置(如傳統基于視圖的 MVC 流程)。

  • 代碼示例

    @Controller
    public class UserController {@GetMapping("/user/json")public String getUser(Model model) {User user = new User("John", 30);model.addAttribute("user", user); // 將數據存入模型return "jsonView"; // 視圖名稱}
    }
    
  • 視圖配置

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic View jsonView() {MappingJackson2JsonView view = new MappingJackson2JsonView();view.setExtractValueFromSingleKeyModel(true); // 自動提取模型中的值return view;}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {registry.enableContentNegotiation(); // 啟用內容協商registry.viewResolver((s, locale) -> jsonView());}
    }
    
  • 依賴:需引入 org.springframework:spring-webmvc 和 Jackson。

  • 特點

    • 傳統視圖方式:依賴視圖解析器和模型數據,流程與 JSP 等視圖一致。
    • 配置復雜:需手動配置視圖和視圖解析器。
    • 靈活性低:無法直接控制 HTTP 狀態碼或頭信息。
    • 適用場景:在需要與傳統視圖(如 JSP)共存時使用。

對比表格(新增 MappingJackson2JsonView

方式適用場景控制能力代碼復雜度依賴是否需要視圖解析器
@ResponseBody簡單返回對象僅返回數據,無狀態/頭控制Jackson
@RestControllerREST API 控制器@ResponseBody,簡化配置Jackson
ResponseEntity需要自定義狀態碼/頭信息狀態碼、頭、數據全控制無額外依賴
@JsonView需要控制序列化字段粒度控制字段序列化Jackson 的 @JsonView
@RequestBody + @ResponseBody雙向 JSON 交互(如 POST/PUT)反序列化請求體,序列化響應體Jackson
MappingJackson2JsonView兼容舊代碼或特定視圖配置僅序列化模型數據,無狀態/頭控制Spring MVC + Jackson

關鍵差異總結(新增 MappingJackson2JsonView

  1. 控制粒度

    • ResponseEntity 提供最高控制(狀態碼、頭、數據)。
    • @JsonView 用于字段級序列化控制。
    • MappingJackson2JsonView 僅能序列化模型數據,無法控制狀態碼或頭。
  2. 代碼簡潔性

    • @RestController@ResponseBody 更簡潔。
    • MappingJackson2JsonView 需要額外配置視圖和解析器,代碼復雜度較高。
  3. 適用場景

    • MappingJackson2JsonView:適合需要與傳統視圖(如 JSP)共存的場景,或在舊代碼中逐步遷移時使用。
    • 其他方式(如 @RestController)更推薦用于現代 RESTful API 開發。
  4. 依賴與配置

    • MappingJackson2JsonView 需要顯式配置視圖和視圖解析器,而其他方式依賴注解和消息轉換器。

注意事項

  • MappingJackson2JsonView 的局限性
    • 需要通過模型傳遞數據,無法直接返回對象。
    • 無法直接設置 HTTP 狀態碼或頭信息,需通過 @ResponseStatusHandlerInterceptor 間接實現。
  • 推薦場景
    • 在需要與傳統視圖(如 JSP)共存的項目中,MappingJackson2JsonView 可作為過渡方案。
    • 現代項目中更推薦使用 @RestControllerResponseEntity,因其簡潔性和靈活性。

通過新增 MappingJackson2JsonView 的對比,可以更全面地理解 Spring MVC 返回 JSON 的多種方式及其適用場景。

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

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

相關文章

瑞芯微RK3568嵌入式AI項目實戰:智能家居項目(二)

RK3568智能家居項目實戰指南&#xff1a;從入門到精通的完整制作流程 瑞芯微RK3568作為一款高性能嵌入式處理器&#xff0c;憑借其四核Cortex-A55架構、1T算力NPU和豐富的外設接口&#xff0c;成為智能家居項目開發的理想平臺。下面我將推薦幾個典型的RK3568智能家居項目&…

GStreamer開發筆記(一):GStreamer介紹,在windows平臺部署安裝,打開usb攝像頭對比測試

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、O…

Spring Boot 3.4.3 和 Spring Security 6.4.2 實現基于內存和 MySQL 的用戶認證

在 Web 應用開發中&#xff0c;用戶認證是保障系統安全的基礎需求。Spring Boot 3.4.3 結合 Spring Security 6.4.2 提供了強大的安全框架支持&#xff0c;可以輕松實現基于內存或數據庫的用戶認證功能。本文將詳細介紹如何在 Spring Boot 3.4.3 中集成 Spring Security 6.4.2&…

HOW - Axios 攔截器特性

目錄 Axios 介紹攔截器特性1. 統一添加 Token&#xff08;請求攔截器&#xff09;2. 處理 401 未授權&#xff08;響應攔截器&#xff09;3. 統一處理錯誤信息&#xff08;響應攔截器&#xff09;4. 請求 Loading 狀態管理5. 自動重試請求&#xff08;如 429 過載&#xff09;6…

JVM核心機制:類加載×字節碼引擎×垃圾回收機制

&#x1f680;前言 “為什么你的Spring應用啟動慢&#xff1f;為什么GC總是突然卡頓&#xff1f;答案藏在JVM的核心機制里&#xff01; 本文將用全流程圖解字節碼案例&#xff0c;帶你穿透三大核心機制&#xff1a; 類加載&#xff1a;雙親委派如何防止惡意代碼入侵&#xff…

coze生成流程圖和思維導圖工作流

需求&#xff1a;通過coze平臺實現生成流程圖和思維導圖&#xff0c;要求支持文檔上傳 最終工作流如下&#xff1a; 入參&#xff1a; 整合用戶需求文件內容的工作流&#xff1a;https://blog.csdn.net/YXWik/article/details/147040071 選擇器分發&#xff0c;不同的類型走…

網絡安全應急響應-文件痕跡排查

在Windows系統的網絡安全應急響應中&#xff0c;文件痕跡排查是識別攻擊行為的關鍵步驟。以下是針對敏感目錄的詳細排查指南及擴展建議&#xff1a; 1. 臨時目錄排查&#xff08;Temp/Tmp&#xff09; 路徑示例&#xff1a; C:\Windows\TempC:\Users\<用戶名>\AppData\L…

SpringBoot集成Redis 靈活使用 TypedTuple 和 DefaultTypedTuple 實現 Redis ZSet 的復雜操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的詳細使用說明&#xff0c;包含代碼示例和場景說明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定義了 Redis 中有序集合&#xff08;ZSet…

遞歸實現組合型枚舉(DFS)

從 1~n 這 n 個整數中隨機選出 m 個&#xff0c;輸出所有可能的選擇方案。 輸入格式 兩個整數 n,m,在同一行用空格隔開。 輸出格式 按照從小到大的順序輸出所有方案&#xff0c;每行 1 個。 首先&#xff0c;同一行內的數升序排列&#xff0c;相鄰兩個數用一個空格隔開。…

CentOS 7 鏡像源失效解決方案(2025年)

執行 yum update 報錯&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加載插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 腳手架初始化項目生成文件的介紹

文章目錄 一、介紹二、舉例說明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 編譯和運行A-LOAM

1.搭建文件目錄和clone代碼 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代碼文件 2.1 由于PCL版本1.10&#xff0c;將CMakeLists.txt中的C標準改為14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安裝 VSCode 并連接遠程服務器

目錄 需求步驟問題處理 需求 在 Mac 上安裝 VSCode&#xff0c;并連接跳板機和服務器。 步驟 Step1&#xff1a;從VSCode官網&#xff08;https://code.visualstudio.com/download&#xff09;下載安裝包&#xff1a; Step2&#xff1a;下載完成之后&#xff0c;直接雙擊就能…

LabVIEW 長期項目開發

LabVIEW 憑借其圖形化編程的獨特優勢&#xff0c;在工業自動化、測試測量等領域得到了廣泛應用。對于長期運行、持續迭代的 LabVIEW 項目而言&#xff0c;其開發過程涵蓋架構設計、代碼管理、性能優化等多個關鍵環節&#xff0c;每個環節都對項目的成功起著至關重要的作用。下面…

用matlab搭建一個簡單的圖像分類網絡

文章目錄 1、數據集準備2、網絡搭建3、訓練網絡4、測試神經網絡5、進行預測6、完整代碼 1、數據集準備 首先準備一個包含十個數字文件夾的DigitsData&#xff0c;每個數字文件夾里包含1000張對應這個數字的圖片&#xff0c;圖片的尺寸都是 28281 像素的&#xff0c;如下圖所示…

Go 語言語法精講:從 Java 開發者的視角全面掌握

《Go 語言語法精講&#xff1a;從 Java 開發者的視角全面掌握》 一、引言1.1 為什么選擇 Go&#xff1f;1.2 適合 Java 開發者的原因1.3 本文目標 二、Go 語言環境搭建2.1 安裝 Go2.2 推薦 IDE2.3 第一個 Go 程序 三、Go 語言基礎語法3.1 變量與常量3.1.1 聲明變量3.1.2 常量定…

如何選擇優質的安全工具柜:材質、結構與功能的考量

在工業生產和實驗室環境中&#xff0c;安全工具柜是必不可少的設備。它不僅承擔著工具的存儲任務&#xff0c;還直接影響工作環境的安全和效率。那么&#xff0c;如何選擇一個優質的安全工具柜呢&#xff1f;關鍵在于對材質、結構和功能的考量。 01材質&#xff1a;耐用與防腐 …

系統與網絡安全------Windows系統安全(11)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 制作U啟動盤 U啟動程序 下載制作U啟程序 Ventoy是一個制作可啟動U盤的開源工具&#xff0c;只需要把ISO等類型的文件拷貝到U盤里面就可以啟動了 同時支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二進制部署)之安裝master節點組件(kube-controller-manager)

注&#xff1a;承接專欄上一篇文章 一、創建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一個WPF程序

WPF程序對界面進行優化,但是比WINFORMS的程序要復雜很多, 并且界面UI基本上不適合拖放,所以需要比較多的時間來布局界面, 產且需要開發人員編寫更多的代碼。 即使如此,在面對誘人的界面表現, 隨著客戶對界面的需求提高,還是需要采用這樣的方式來實現。 界面的樣式采…