解析若依 `R.java` 類——ruoyi-common-core

文章目錄

  • 1. 類的整體功能
  • 2. 代碼解析
    • 2.1 成員變量和常量
    • 2.2 靜態方法構造響應對象
    • 2.3 內部私有方法 `restResult`
    • 2.4 工具方法
  • 3. 開發中的應用擴展
    • 3.1 接口規范化
    • 3.2 快速響應構造
    • 3.3 自定義狀態碼
    • 3.4 自定義擴展

R.java 是若依框架中通用的 API 響應封裝類,主要用于統一接口響應格式,簡化前后端數據交互。它定義了統一的響應結構,包括狀態碼、消息以及數據對象。本文將詳細解析其代碼實現及設計思想,結合實際開發場景給出改進建議和專業見解。


1. 類的整體功能

該類是一個泛型類,核心功能包括:

  • 提供標準化的響應結果封裝方法 (okfail)。
  • 定義常見的響應狀態碼 (SUCCESSFAIL)。
  • 提供輔助方法用于檢查響應狀態 (isSuccessisError)。

2. 代碼解析

2.1 成員變量和常量

private int code;
private String msg;
private T data;
public static final int SUCCESS = Constants.SUCCESS;
public static final int FAIL = Constants.FAIL;
  • code:狀態碼,標識操作結果。
  • msg:響應消息,便于描述操作結果。
  • data:泛型數據,支持任意類型的返回值。
  • SUCCESSFAIL:引用常量類 Constants 中的定義,增強了代碼的一致性和可維護性。

2.2 靜態方法構造響應對象

  • 成功響應
public static <T> R<T> ok() { return restResult(null, SUCCESS, null); }
public static <T> R<T> ok(T data) { return restResult(data, SUCCESS, null); }
public static <T> R<T> ok(T data, String msg) { return restResult(data, SUCCESS, msg); }

這些方法用于構造成功的響應結果,支持不帶數據、僅帶數據、以及帶數據和消息的場景。

  • 失敗響應
public static <T> R<T> fail() { return restResult(null, FAIL, null); }
public static <T> R<T> fail(String msg) { return restResult(null, FAIL, msg); }
public static <T> R<T> fail(T data) { return restResult(data, FAIL, null); }
public static <T> R<T> fail(T data, String msg) { return restResult(data, FAIL, msg); }

類似于成功響應,失敗響應也提供了多種構造方式。

  • 自定義狀態碼的失敗響應
public static <T> R<T> fail(int code, String msg) {return restResult(null, code, msg);
}

允許自定義錯誤狀態碼,適合復雜業務場景。

2.3 內部私有方法 restResult

private static <T> R<T> restResult(T data, int code, String msg) {R<T> apiResult = new R<>();apiResult.setCode(code);apiResult.setData(data);apiResult.setMsg(msg);return apiResult;
}

此方法是響應對象構造的核心邏輯,統一設置響應的各個字段,提升了代碼的復用性。

2.4 工具方法

  • 判斷響應狀態
public static <T> Boolean isSuccess(R<T> ret) {return R.SUCCESS == ret.getCode();
}
public static <T> Boolean isError(R<T> ret) {return !isSuccess(ret);
}

這兩個方法為調用方提供了便捷的響應狀態判斷,減少了硬編碼。


3. 開發中的應用擴展

R.java 的設計不僅提供了標準化的響應結構,還在各種業務場景中發揮了重要作用。以下是其具體應用場景的詳細擴展,并結合實際代碼示例。

3.1 接口規范化

在前后端協作的開發模式中,約定統一的響應結構是高效對接的基礎。通過使用 R 類,開發者可以定義統一的 API 接口返回標準,讓前端能夠輕松解析數據。

示例代碼
后端接口實現規范化的 API 響應:

@GetMapping("/user/{id}")
public R<User> getUserById(@PathVariable Long id) {User user = userService.getById(id);if (user == null) {return R.fail("用戶不存在");}return R.ok(user);
}

前端通過約定的響應結構解析數據:

fetch('/api/user/1').then(response => response.json()).then(data => {if (data.code === 200) {console.log("用戶信息:", data.data);} else {console.error("錯誤信息:", data.msg);}});

通過上述規范化的響應結構,減少了前端對不同接口響應格式的適配成本。


3.2 快速響應構造

在日常開發中,構造標準的 API 響應是一項重復且枯燥的工作。R 類提供了快捷的靜態方法,例如 R.okR.fail,極大地簡化了響應的構造過程。

示例代碼

@PostMapping("/add")
public R<Void> addUser(@RequestBody User user) {boolean isAdded = userService.add(user);return isAdded ? R.ok() : R.fail("添加用戶失敗");
}

對于無需返回數據的操作,R.ok()R.fail(msg) 簡潔明了,避免了手動設置狀態碼和消息的冗余代碼。


3.3 自定義狀態碼

在復雜的業務場景中,單一的 SUCCESSFAIL 狀態碼可能無法滿足需求。通過 R.fail(int code, String msg) 方法,可以輕松擴展狀態碼的應用。

示例代碼
假設我們有一個用戶注冊接口,需要返回不同的錯誤狀態:

@PostMapping("/register")
public R<Void> register(@RequestBody User user) {if (userService.isEmailTaken(user.getEmail())) {return R.fail(409, "郵箱已被占用");}if (userService.isUsernameTaken(user.getUsername())) {return R.fail(409, "用戶名已被占用");}boolean isRegistered = userService.register(user);return isRegistered ? R.ok() : R.fail(500, "注冊失敗,服務器異常");
}

前端可以根據狀態碼做更細粒度的處理:

fetch('/api/register', { method: 'POST', body: JSON.stringify(user) }).then(response => response.json()).then(data => {switch (data.code) {case 200:alert("注冊成功");break;case 409:alert("沖突錯誤:" + data.msg);break;case 500:console.error("服務器錯誤:" + data.msg);break;}});

3.4 自定義擴展

  • R.java 提供的靜態方法和統一的響應結構,減少了接口開發中的重復勞動,同時提升了代碼的可讀性和一致性。
  1. 增強系統魯棒性

    • 在分布式服務中,通過 R 類結合全局異常處理,可以統一處理和捕獲系統中的異常,提升服務的穩定性。
    • 例如,使用 @ControllerAdvice 捕獲異常并返回 R 響應:
      @RestControllerAdvice
      public class GlobalExceptionHandler {@ExceptionHandler(ServiceException.class)public R<Void> handleServiceException(ServiceException ex) {return R.fail(ex.getCode(), ex.getMessage());}
      }
      
  2. 支持復雜場景擴展

    • 在分頁查詢場景中,可以通過擴展 R 類的 data 字段支持分頁數據:
      @GetMapping("/list")
      public R<Map<String, Object>> listUsers(PageRequest request) {PageResult<User> result = userService.queryPage(request);Map<String, Object> data = new HashMap<>();data.put("list", result.getList());data.put("total", result.getTotal());return R.ok(data, "查詢成功");
      }
      
  3. 自定義擴展

    • 增加鏈式調用支持:

      public R<T> code(int code) {this.code = code;return this;
      }public R<T> msg(String msg) {this.msg = msg;return this;
      }public R<T> data(T data) {this.data = data;return this;
      }
      
    • 使用鏈式調用構造響應:

      return new R<>().code(200).msg("操作成功").data(user);
      

通過這些實際場景的應用與見解,R 類的核心價值不僅限于統一響應結構,還能夠進一步優化開發體驗并支持復雜業務需求。

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

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

相關文章

Perl語言的數據結構

Perl語言的數據結構 Perl是一種功能強大的、靈活的腳本語言&#xff0c;廣泛用于文本處理、系統管理、網絡編程以及許多其他領域。其靈活性不僅體現在語法上&#xff0c;還體現在其豐富的數據結構上。本文將深入探討Perl的主要數據結構&#xff0c;包括標量、數組、哈希以及引…

RK3588上CPU和GPU算力以及opencv resize的性能對比測試

RK3588上CPU和GPU算力以及opencv resize的性能對比測試 一.背景二.小結三.相關鏈接四.操作步驟1.環境搭建A.安裝依賴B.設置GPU為高性能模式C.獲取GPU信息D.獲取CPU信息 2.調用OpenCL SDK獲取GPU信息3.使用OpenCL API計算矩陣乘4.使用clpeak測試GPU的性能5.使用OpenBLAS測試CPU的…

轉運機器人在物流倉儲行業的優勢特點

在智能制造與智慧物流的浪潮中&#xff0c;一款革命性的產品正悄然改變著行業的面貌——富唯智能轉運機器人&#xff0c;它以卓越的智能科技與創新的設計理念&#xff0c;引領著物流領域步入一個全新的高效、智能、無人的時代。 一、解放雙手&#xff0c;重塑物流生態 富唯智能…

基于單片機的無線智能窗簾控制器的設計

摘 要 : 本文以單片機為控制核心 , 基于 PT2262/ 2272 無線收發模塊 , 實現了窗簾的無線遠程智能控制 . 該控制器通過高頻無線收發模塊實現了遙控窗簾的開合控制; 根據外部光線強弱實現自動開關窗簾 ; 根據設定時間自動完成開關過程; 通過語音播報當前環境溫濕度信息以…

linux centos掛載未分配的磁盤空間

使用到的命令 lshw -class disk -short hostnamectl fdisk /dev/sdb partprobe /dev/sdb mount /dev/sdb2 /opt/fastdfs/ mkfs.ext4 /dev/sdb2 mount -t ext4 /dev/sdb2 /opt/fastdfs/

Vivado中Tri_mode_ethernet_mac的時序約束、分析、調整——(一)時序約束的基本概念

1、基本概念 推薦閱讀&#xff0c;Ally Zhou編寫的《Vivado使用誤區與進階》系列文章&#xff0c;熟悉基本概念、tcl語句的使用。 《Vivado使用誤區與進階》電子書開放下載&#xff01;&#xff01; 2、Vivado中的語法例程 1&#xff09;語法例程 約束的語句可以參考vivado…

基于Spring Boot的城市垃圾分類管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

springboot整合admin

1. 添加依賴 首先&#xff0c;在你的admin服務端pom.xml文件中添加Spring Boot Admin的依賴&#xff1a; <dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.5.4<…

【YOLOv8雜草作物目標檢測】

YOLOv8雜草目標檢測 算法介紹模型和數據集下載 算法介紹 YOLOv8在禾本科雜草目標檢測方面有顯著的應用和效果。以下是一些關鍵信息的總結&#xff1a; 農作物幼苗與雜草檢測系統&#xff1a;基于YOLOv8深度學習框架&#xff0c;通過2822張圖片訓練了一個目標檢測模型&#xff…

比亞迪夏直插家用MPV腹地,“迪王”開啟全面銷冠新征程

文/王俁祺 導語&#xff1a;比亞迪前腳剛收獲2024年的全面成功&#xff0c;后腳立刻就開始布局2025年的產品矩陣了。比亞迪夏的橫空出世&#xff0c;看來家用MPV市場也要感受“迪王”的恐怖如斯了。 家用MPV市場的“意外之喜” 1月8日&#xff0c;比亞迪夏終于在萬眾矚目之下…

左值引用(Lvalue Reference)和右值引用(Rvalue Reference)詳解

左值引用&#xff08;Lvalue Reference&#xff09;和右值引用&#xff08;Rvalue Reference&#xff09;詳解 文章目錄 左值引用&#xff08;Lvalue Reference&#xff09;和右值引用&#xff08;Rvalue Reference&#xff09;詳解1. 什么是左值和右值&#xff1f;左值&#x…

探索數據存儲的奧秘:深入理解B樹與B+樹

key value 類型的數據紅黑樹&#xff08;最優二叉樹&#xff0c;內存最優&#xff09;&#xff0c;時間復雜度&#xff1a;O&#xff08;logn&#xff09;,調整方便&#xff1b;一個結點分出兩個叉B樹一個節點可以分出很多叉數據量相等的條件下&#xff1a;紅黑樹的層數很高&am…

聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub

聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub 目錄 聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHubPEFT 技術及簡單舉例PEFT 技術代碼實現提示詞工程不僅僅在聊天對話框實現,還可以再代碼中實現聯邦大語言模…

L1G5000 XTuner 微調個人小助手認知

使用 XTuner 微調 InternLM2-Chat-7B 實現自己的小助手認知 1 環境配置與數據準備步驟 0. 使用 conda 先構建一個 Python-3.10 的虛擬環境步驟 1. 安裝 XTuner 修改提供的數據步驟 0. 創建一個新的文件夾用于存儲微調數據步驟 1. 創建修改腳本步驟 2. 執行腳本步驟 3. 查看數據…

網絡協議安全的攻擊手法

1.使用SYN Flood泛洪攻擊&#xff1a; SYN Flood(半開放攻擊)是最經典的ddos攻擊之一&#xff0c;他利用了TCP協議的三次握手機制&#xff0c;攻擊者通常利用工具或控制僵尸主機向服務器發送海量的變源端口的TCP SYN報文&#xff0c;服務器響應了這些報文后就會生成大量的半連…

人工智能學習路線全鏈路解析

一、基礎準備階段&#xff08;預計 2-3 個月&#xff09; &#xff08;一&#xff09;數學知識鞏固與深化 線性代數&#xff08;約 1 個月&#xff09;&#xff1a; 矩陣基礎&#xff1a;回顧矩陣的定義、表示方法、矩陣的基本運算&#xff08;加法、減法、乘法&#xff09;&…

Redis 安裝與 Spring Boot 集成指南

安裝 Redis 和將其與 Spring Boot 應用集成是構建高效緩存解決方案的常見步驟。以下是詳細的指南&#xff0c;幫助你在本地環境中安裝 Redis&#xff0c;并在 Spring Boot 項目中配置和使用它。 1. 安裝 Redis Windows 環境 Redis 官方并不直接支持 Windows&#xff0c;但你…

3d打印材料是塑料么?pla petg

3D 打印材料不僅限于塑料&#xff0c;但塑料確實是最常見的材料類型之一。以下是一些常用的3D打印塑料材料的介紹&#xff1a; 1. PLA&#xff08;聚乳酸&#xff09; ? 特點&#xff1a;可生物降解&#xff0c;環保&#xff0c;容易打印&#xff0c;表面光滑。 ? 適用…

linux-磁盤io性能指標!

一. 引文&#xff1a; 平時查看或者監控磁盤io時&#xff0c;基本上都是用的現成的工具/腳本&#xff0c; 對其了解的還是很淺&#xff0c;特參考一些資料整理了下&#xff0c;留個隨筆。 二.磁盤I/O性能指標: 磁盤 I/O 是 Unix/Linux 系統管理中一個非常重要的組成部分。磁盤…

Excel 技巧08 - 如何計算某類(比如紅色背景色)單元格的總和? (★)

本文講了如何在Excel中計算某類(比如紅色背景色)單元格的總和。 1&#xff0c;如何計算某類(比如紅色背景色)單元格的總和&#xff1f; 技巧就是先把它們給標記出來&#xff0c;然后就好統計了。 那么如何找出來呢&#xff1f; 對&#xff0c;就是通過紅色。 按下Ctrl F 點…