Spring MVC 中通过自定义 HandlerMethodReturnValueHandler 统一包装 RESTful 响应,使所有接口返回标准结构 {"code":200,"msg":"success","data":{...}};配合 @ControllerAdvice 全局异常处理,确保成功与错误响应格式一致。

在 Spring MVC 中统一包装 RESTful 响应结果,核心目标是让所有接口返回结构一致(如 {"code":200,"msg":"success","data":{...}}),避免每个 Controller 方法手动封装,同时兼顾可读性、可维护性和前后端协作效率。
定义标准响应类
先创建一个通用的响应包装类,通常包含状态码、提示信息和业务数据三部分:
- 字段建议用
Integer code、String msg、T data,泛型支持任意类型返回值 - 提供静态工厂方法,如
Result.success(data)和Result.failure("xxx"),调用简洁 - 实体类加
@Getter(Lombok)或完整 getter,确保 Jackson 能正常序列化 - 可选:加
@JsonInclude(JsonInclude.Include.NON_NULL)避免空字段出现在 JSON 中
控制器层直接返回业务对象
使用 @RestController 标注类后,方法默认返回 JSON。此时不直接返回 Result,而是返回原始业务对象(如 User、List<Order>),把包装逻辑后置:
- 例如:
@GetMapping("/{id}") public User getUser(@PathVariable Long id) { return userService.getById(id); } - 这样写更专注业务,Controller 不掺杂响应格式逻辑
- 后续通过拦截器或返回值处理器统一套壳,解耦清晰
用 HandlerMethodReturnValueHandler 自动包装
这是最推荐的统一处理方式,Spring MVC 提供了扩展点,在 Controller 方法执行完、写入响应前自动包装返回值:
- 实现
HandlerMethodReturnValueHandler接口,判断返回类型是否为业务类(非String、ResponseEntity、Void等) - 若符合,则构造
Result.success(returnValue)并替换原返回值 - 注册该处理器时,需放在默认处理器之前(通过
WebMvcConfigurer.addReturnValueHandlers()) - 优点:零侵入、全局生效、无需修改任何 Controller 代码
配合全局异常处理保持一致性
包装只解决“成功”路径,异常情况也要返回同样结构:
- 用
@ControllerAdvice+@ExceptionHandler捕获常见异常(如IllegalArgumentException、自定义业务异常) - 每个异常处理器都返回
Result.failure(...),确保错误响应也带code和msg - 对未捕获的异常,可设兜底处理器返回
Result.failure("系统繁忙"),code 设为 500 - 注意:HTTP 状态码仍应匹配语义(如 404 返回
HttpStatus.NOT_FOUND),可用ResponseEntity<Result>控制


















