本文是「EduCore 教务系统实战系列」重要篇章,介绍如何设计一个基于泛型的统一响应封装类
R<T>
,实现接口响应标准化、状态码枚举、链式调用和 Swagger 集成,从而大幅提升开发效率与接口维护体验。
🎯 设计目标
- 统一接口响应格式,前后端契约清晰
- 采用泛型支持各种业务数据类型
- 集成状态码枚举,避免魔法数字
- 支持链式调用,代码更优雅
- 兼容 Swagger 自动文档生成
🧱 核心代码设计
1. 泛型响应类结构
java
public class R<T> implements Serializable {
private Integer code; // 状态码
private String message; // 提示信息
private T data; // 业务数据
private Map<String, Object> dataMap; // 额外数据(互斥)
// 成功响应构造
public static <T> R<T> ok(T data) {
R<T> r = new R<>();
r.code = ResultCodeEnum.SUCCESS.getCode();
r.message = ResultCodeEnum.SUCCESS.getMessage();
r.data = data;
return r;
}
// 链式设置消息
public R<T> message(String msg) {
this.message = msg;
return this;
}
// 设置额外数据
public R<T> dataMap(String key, Object value) {
this.dataMap = Collections.singletonMap(key, value);
return this;
}
}
2. 状态码枚举示例
java
public enum ResultCodeEnum {
SUCCESS(20000, "请求成功"),
FAIL(20001, "请求失败"),
UNAUTHORIZED(401, "未授权"),
// 更多状态码...
}
⚙️ 使用示例
java
@ApiOperation("查询用户列表")
@GetMapping("/users")
public R<List<UserDTO>> listUsers() {
List<UserDTO> users = userService.listAll();
return R.ok(users);
}
Swagger 会识别
R<List<UserDTO>>
,自动生成标准化接口文档。
💡 设计亮点解析
- 泛型优势:接口返回数据任意类型,增强代码复用性
- 链式调用 :响应构造更简洁,如
.ok(data).message("操作成功")
- 互斥设计 :
data
与dataMap
避免同时出现冗余数据 - Jackson 控制 :配合
@JsonInclude
实现非空序列化
📌 开发建议
- 立即在项目中引入该统一响应类
- 结合 Spring Boot 3 的
@ResponseBodyAdvice
,实现控制器统一封装 - 通过枚举集中管理状态码,方便维护与扩展
🔚 总结
统一响应封装是打造规范、高效接口的基石。合理的设计可以极大简化前后端交互,提升开发体验。希望本文能为你构建更稳定、易维护的 API 提供实用参考。
🔗 项目源码地址
- GitHub:gitee.com/codevibe/gr...
- Axios 封装、前后端对接代码已上传,支持一键部署体验
🙋♂️ 如果你觉得这篇文章有帮助:
- 点赞 👍
- 收藏 ⭐
- 评论 💬
- 关注我 👇 获取后续实战内容