Java Spring MVC 通过定义通用响应类Result<T>和实现ResponseBodyAdvice接口,在序列化前自动封装所有非包装返回值为统一结构,配合@ControllerAdvice处理异常,确保前后端交互遵循标准JSON格式。

Java Spring MVC 通过统一响应结果包装类规范后端 API 输出,核心是“定义标准结构 + 自动拦截封装”,而不是靠每个 Controller 手动 new Result。关键在于用 ResponseBodyAdvice 在序列化前统一介入,让所有非包装类型的返回值自动套进标准结构中。
定义通用响应类 Result<T>
这是整个方案的数据基石。它需包含状态码、提示信息、业务数据三要素,并提供静态构造方法提升可读性:
- 字段建议用
int code(避免 null)、String message、T data - 添加
@JsonInclude(JsonInclude.Include.NON_NULL)防止空 data 字段出现在 JSON 中 - 提供
Result.success(data)和Result.fail(code, msg)等静态工厂方法 - 可选:内置常用错误码枚举(如 SUCCESS=200、PARAM_ERROR=400、SYSTEM_ERROR=500)
用 ResponseBodyAdvice 实现自动包装
实现 ResponseBodyAdvice<Object> 接口,在 beforeBodyWrite 中判断是否需要包装:
-
supports()返回true表示对所有控制器方法生效(也可按包名、注解、返回类型做过滤) -
beforeBodyWrite()中先检查body instanceof Result,是则直接返回,避免重复包装 - 否则调用
Result.success(body)包装原始返回值(如 User、List<Order>、String 等) - 注意 void 方法返回 null,需单独处理为
Result.success(null)或跳过
配合 @RestController 和 RESTful 路由设计
统一响应不是孤立功能,需与接口风格协同:
立即学习“Java免费学习笔记(深入)”;
- 用
@RestController替代@Controller + @ResponseBody,确保方法默认返回 JSON - 类上用
@RequestMapping("/api/users")定义资源路径,方法上用@GetMapping、@PostMapping明确语义 - 返回值保持语义清晰:查询方法返回
List<User>,创建方法返回User,框架会自动包装成Result<List<User>>或Result<User>
异常也走统一结构(用 @ControllerAdvice)
正常响应靠 ResponseBodyAdvice,异常响应靠 @ControllerAdvice + @ExceptionHandler:
- 捕获
RuntimeException、IllegalArgumentException等常见异常 - 根据异常类型或自定义业务异常类(如
BusinessException),返回对应Result.fail(code, msg) - 全局异常处理器和响应包装器共存,确保无论成功还是失败,前端收到的都是
{ "code":xxx, "message":"xxx", "data":xxx }


















