spring boot 中统一用泛型 result 封装 controller 返回值,通过定义含 code、msg、data 的不可变响应类,配合全局异常处理器和可选的 responsebodyadvice 实现标准化响应。

在 Spring Boot 项目中,统一用泛型 Result<t></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);
}
}</void></void></t></t></t></font>
Controller 层直接返回 Result
不用每个方法手动 new,直接用静态工厂方法,语义清晰且类型安全:
-
return Result.success(user);→ 返回用户对象,data 类型自动推断为 User -
return Result.success();→ 无返回值的接口(如删除) -
return Result.fail(400, "参数错误");→ 快速返回错误
配合 @RestControllerAdvice 统一处理异常
避免业务代码里到处 try-catch,把常见异常(如参数校验失败、空指针、自定义业务异常)转成标准 Result:
<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, "系统繁忙,请稍后再试");
}
}</void></void></void></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);
}
}</object></font>
启用后,Controller 可写 return userService.findById(id);,框架自动转为 Result.success(user) —— 但建议慎用,显式返回 Result 更利于维护和排查。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











