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

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

R.java 是若依框架中通用的 API 相应封装类,主要用于同一接口相应格式,简化前后端数据交互。它定义了同一的相应布局,包括状态码、消息以及数据对象。本文将详细解析其代码实现及设计头脑,结合现实开发场景给出改进建媾和专业看法。

1. 类的整体功能

该类是一个泛型类,核心功能包括:


  • 提供标准化的相应效果封装方法 (ok、fail)。
  • 定义常见的相应状态码 (SUCCESS、FAIL)。
  • 提供辅助方法用于查抄相应状态 (isSuccess、isError)。

2. 代码解析

2.1 成员变量和常量

  1. private int code;
  2. private String msg;
  3. private T data;
  4. public static final int SUCCESS = Constants.SUCCESS;
  5. public static final int FAIL = Constants.FAIL;
复制代码


  • code:状态码,标识操作效果。
  • msg:相应消息,便于描述操作效果。
  • data:泛型数据,支持恣意类型的返回值。
  • SUCCESS 和 FAIL:引用常量类 Constants 中的定义,增强了代码的同等性和可维护性。
2.2 静态方法构造相应对象



  • 乐成相应
  1. public static <T> R<T> ok() { return restResult(null, SUCCESS, null); }
  2. public static <T> R<T> ok(T data) { return restResult(data, SUCCESS, null); }
  3. public static <T> R<T> ok(T data, String msg) { return restResult(data, SUCCESS, msg); }
复制代码
这些方法用于构造乐成的相应效果,支持不带数据、仅带数据、以及带数据和消息的场景。


  • 失败相应
  1. public static <T> R<T> fail() { return restResult(null, FAIL, null); }
  2. public static <T> R<T> fail(String msg) { return restResult(null, FAIL, msg); }
  3. public static <T> R<T> fail(T data) { return restResult(data, FAIL, null); }
  4. public static <T> R<T> fail(T data, String msg) { return restResult(data, FAIL, msg); }
复制代码
类似于乐成相应,失败相应也提供了多种构造方式。


  • 自定义状态码的失败相应
  1. public static <T> R<T> fail(int code, String msg) {
  2.     return restResult(null, code, msg);
  3. }
复制代码
允许自定义错误状态码,得当复杂业务场景。
2.3 内部私有方法 restResult

  1. private static <T> R<T> restResult(T data, int code, String msg) {
  2.     R<T> apiResult = new R<>();
  3.     apiResult.setCode(code);
  4.     apiResult.setData(data);
  5.     apiResult.setMsg(msg);
  6.     return apiResult;
  7. }
复制代码
此方法是相应对象构造的核心逻辑,同一设置相应的各个字段,提升了代码的复用性。
2.4 工具方法



  • 判断相应状态
  1. public static <T> Boolean isSuccess(R<T> ret) {
  2.     return R.SUCCESS == ret.getCode();
  3. }
  4. public static <T> Boolean isError(R<T> ret) {
  5.     return !isSuccess(ret);
  6. }
复制代码
这两个方法为调用方提供了便捷的相应状态判断,减少了硬编码。

3. 开发中的应用扩展

R.java 的设计不仅提供了标准化的相应布局,还在各种业务场景中发挥了紧张作用。以下是其具体应用场景的详细扩展,并结合现实代码示例。
3.1 接口规范化

在前后端协作的开发模式中,约定同一的相应布局是高效对接的底子。通过使用 R 类,开发者可以定义同一的 API 接口返回标准,让前端可以大概轻松解析数据。
示例代码
后端接口实现规范化的 API 相应:
  1. @GetMapping("/user/{id}")
  2. public R<User> getUserById(@PathVariable Long id) {
  3.     User user = userService.getById(id);
  4.     if (user == null) {
  5.         return R.fail("用户不存在");
  6.     }
  7.     return R.ok(user);
  8. }
复制代码
前端通过约定的相应布局解析数据:
  1. fetch('/api/user/1')
  2.   .then(response => response.json())
  3.   .then(data => {
  4.     if (data.code === 200) {
  5.       console.log("用户信息:", data.data);
  6.     } else {
  7.       console.error("错误信息:", data.msg);
  8.     }
  9.   });
复制代码
通过上述规范化的相应布局,减少了前端对不同接口相应格式的适配成本。

3.2 快速相应构造

在一样平常开发中,构造标准的 API 相应是一项重复且枯燥的工作。R 类提供了快捷的静态方法,比方 R.ok 和 R.fail,极大地简化了相应的构造过程。
示例代码
  1. @PostMapping("/add")
  2. public R<Void> addUser(@RequestBody User user) {
  3.     boolean isAdded = userService.add(user);
  4.     return isAdded ? R.ok() : R.fail("添加用户失败");
  5. }
复制代码
对于无需返回数据的操作,R.ok() 和 R.fail(msg) 轻便明确,避免了手动设置状态码和消息的冗余代码。

3.3 自定义状态码

在复杂的业务场景中,单一的 SUCCESS 和 FAIL 状态码可能无法满意需求。通过 R.fail(int code, String msg) 方法,可以轻松扩展状态码的应用。
示例代码
假设我们有一个用户注册接口,必要返回不同的错误状态:
  1. @PostMapping("/register")
  2. public R<Void> register(@RequestBody User user) {
  3.     if (userService.isEmailTaken(user.getEmail())) {
  4.         return R.fail(409, "邮箱已被占用");
  5.     }
  6.     if (userService.isUsernameTaken(user.getUsername())) {
  7.         return R.fail(409, "用户名已被占用");
  8.     }
  9.     boolean isRegistered = userService.register(user);
  10.     return isRegistered ? R.ok() : R.fail(500, "注册失败,服务器异常");
  11. }
复制代码
前端可以根据状态码做更细粒度的处置惩罚:
  1. fetch('/api/register', { method: 'POST', body: JSON.stringify(user) })
  2.   .then(response => response.json())
  3.   .then(data => {
  4.     switch (data.code) {
  5.       case 200:
  6.         alert("注册成功");
  7.         break;
  8.       case 409:
  9.         alert("冲突错误:" + data.msg);
  10.         break;
  11.       case 500:
  12.         console.error("服务器错误:" + data.msg);
  13.         break;
  14.     }
  15.   });
复制代码

3.4 自定义扩展



  • R.java 提供的静态方法和同一的相应布局,减少了接口开发中的重复劳动,同时提升了代码的可读性和同等性。

  • 增强系统鲁棒性

    • 在分布式服务中,通过 R 类结合全局异常处置惩罚,可以同一处置惩罚和捕获系统中的异常,提升服务的稳定性。
    • 比方,使用 @ControllerAdvice 捕获异常并返回 R 相应:
      1. @RestControllerAdvice
      2. public class GlobalExceptionHandler {
      3.     @ExceptionHandler(ServiceException.class)
      4.     public R<Void> handleServiceException(ServiceException ex) {
      5.         return R.fail(ex.getCode(), ex.getMessage());
      6.     }
      7. }
      复制代码

  • 支持复杂场景扩展

    • 在分页查询场景中,可以通过扩展 R 类的 data 字段支持分页数据:
      1. @GetMapping("/list")
      2. public R<Map<String, Object>> listUsers(PageRequest request) {
      3.     PageResult<User> result = userService.queryPage(request);
      4.     Map<String, Object> data = new HashMap<>();
      5.     data.put("list", result.getList());
      6.     data.put("total", result.getTotal());
      7.     return R.ok(data, "查询成功");
      8. }
      复制代码

  • 自定义扩展

    • 增长链式调用支持:
      1. public R<T> code(int code) {
      2.     this.code = code;
      3.     return this;
      4. }
      5. public R<T> msg(String msg) {
      6.     this.msg = msg;
      7.     return this;
      8. }
      9. public R<T> data(T data) {
      10.     this.data = data;
      11.     return this;
      12. }
      复制代码
    • 使用链式调用构造相应:
      1. return new R<>()
      2.     .code(200)
      3.     .msg("操作成功")
      4.     .data(user);
      复制代码

通过这些现实场景的应用与看法,R 类的核心价值不仅限于同一相应布局,还可以大概进一步优化开发体验并支持复杂业务需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表