统一返回值wrapper应包含code、message、data、timestamp(推荐)四个核心字段,采用泛型保证类型安全,提供success()、fail()等语义化静态工厂方法,并通过@controlleradvice自动包装响应与异常。

设计一个通用、标准、可复用的统一返回值 Wrapper,核心是**兼顾规范性、扩展性、易用性与前后端协作友好性**。它不该只为“包装成功/失败”,而应成为接口契约的载体。
明确 Wrapper 的核心字段(最小必要集)
避免过度设计,先定义不可缺失的语义化字段:
- code:业务状态码(非 HTTP 状态码),如 200(成功)、400(参数错误)、500(服务异常)、401(未登录)等;建议使用整数,便于前端 switch 判断
- message:面向用户或开发者的简明提示,非堆栈信息;生产环境不暴露敏感细节
- data:泛型承载实际业务数据(可为 null、对象、列表、空对象等),类型安全靠泛型约束
- timestamp(可选但推荐):响应时间毫秒戳,便于排查时序问题、客户端缓存控制
用泛型支持任意数据类型,拒绝 Object 或 Map
硬编码 data 为 Object 或 Map 会丢失类型信息,导致调用方频繁强转、IDE 无法提示、JSON 序列化异常。正确做法是声明泛型:
<font size="2">public class Result<t> {
private int code;
private String message;
private T data;
private long timestamp;
// 构造方法、getter/setter、静态工厂方法(如 success(data)、fail(code, msg))
}</t></font>
这样 Controller 层可精准返回:Result<user></user>、Result<list>></list>、Result<void></void>(无数据时用 Void 或直接 null)
提供语义化静态构造方法,屏蔽 new 操作
禁止让业务代码手动 new Result(...),易出错且不统一。封装常用场景的静态工厂方法:
- success(T data):code=200,message="OK",自动填充 timestamp
- success():data=null,适用于纯行为接口(如删除、提交)
- fail(int code, String message):通用失败构造
- fail(BizCodeEnum enum):对接枚举状态码(推荐,集中管理 code/message)
- of(int code, String message, T data):兜底方法,供特殊场景使用
与全局异常处理器和 WebMvc 集成
Wrapper 的价值在“自动生效”。配合 @ControllerAdvice + @ResponseBodyAdvice 可实现透明包装:
- 所有 @RestController 返回值自动被 Result
包裹(包括 void 方法返回 Result ) - 全局捕获 Exception,根据类型/场景转换为对应 Result.fail(...) 并设置 HTTP 状态码(如 401 → 401,500 → 500)
- 避免在每个 Controller 里手动调 success(),真正实现“业务代码只关注 data”











