Spring Boot 中统一用泛型 Result<T> 封装 Controller 返回值,通过定义含 code、msg、data 的不可变响应类,配合全局异常处理器和可选的 ResponseBodyAdvice 实现标准化响应。

在 Spring Boot 项目中,统一用泛型 Result<T> 封装 Controller 的返回值,核心是定义一个通用响应体类,并配合全局异常处理和统一返回拦截,让所有接口都自动套上标准结构。
定义泛型 Result 类
这是一个不可变、简洁、符合 REST 规范的响应体。包含状态码、消息、数据三要素,泛型支持任意返回类型:
<font size="2">public class Result<T> {
private int code;
private String msg;
private T data;
private Result(int code, String msg) {
this.code = code;
this.msg = msg;
}
private Result(int code, String msg, T data) {
this(code, msg);
this.data = data;
}
// 成功时调用(带数据)
public static <T> Result<T> success(T data) {
return new Result<>(200, "OK", data);
}
// 成功时调用(无数据)
public static Result<Void> success() {
return new Result<>(200, "OK");
}
// 失败时调用
public static Result<Void> fail(int code, String msg) {
return new Result<>(code, msg);
}
}</font>
Controller 层直接返回 Result<T>
不用每个方法手动 new,直接用静态工厂方法,语义清晰且类型安全:
-
return Result.success(user);→ 返回用户对象,data 类型自动推断为 User -
return Result.success();→ 无返回值的接口(如删除) -
return Result.fail(400, "参数错误");→ 快速返回错误
配合 @RestControllerAdvice 统一处理异常
避免业务代码里到处 try-catch,把常见异常(如参数校验失败、空指针、自定义业务异常)转成标准 Result:
立即学习“Java免费学习笔记(深入)”;
<font size="2">@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleValidation(Exception e) {
return Result.fail(400, "参数校验失败");
}
@ExceptionHandler(BusinessException.class)
public Result<Void> handleBusiness(BusinessException e) {
return Result.fail(e.getCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
public Result<Void> handleUnknown(Exception e) {
return Result.fail(500, "系统繁忙,请稍后再试");
}
}</font>
可选:用 @ControllerAdvice + ResponseBodyAdvice 做返回值增强
如果希望所有 return user; 自动包装成 Result.success(user)(即“隐式封装”),可用 ResponseBodyAdvice:
<font size="2">@ControllerAdvice
public class ResultResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 排除已返回 Result 的情况,避免嵌套
return !Result.class.isAssignableFrom(returnType.getParameterType());
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if (body == null) {
return Result.success();
}
if (body instanceof Result) {
return body;
}
return Result.success(body);
}
}</font>
启用后,Controller 可写 return userService.findById(id);,框架自动转为 Result.success(user) —— 但建议慎用,显式返回 Result 更利于维护和排查。


















