Java Spring Boot中全局异常捕获与标准化响应封装的核心是:用@RestControllerAdvice统一处理异常,配合自定义BusinessException和通用Result类,实现接口响应结构统一、错误码可识别、日志精准记录。

在 Java 项目(尤其是 Spring Boot)中,全局异常捕获与标准化响应封装是提升系统健壮性和接口一致性的关键实践。核心思路是:用 @ControllerAdvice 统一拦截异常,配合自定义异常类 + 统一返回结果类,让所有接口无论成功还是失败,都输出结构清晰、字段统一的 JSON 响应。
定义标准化响应体 Result
创建一个通用的响应包装类,包含状态码、消息、数据等基础字段,便于前后端约定:
public class Result<T> {
private int code;
private String message;
private T data;
// 静态工厂方法:成功
public static <T> Result<T> success(T data) {
Result<T> r = new Result<>();
r.code = 200;
r.message = "OK";
r.data = data;
return r;
}
// 静态工厂方法:失败(带错误码和消息)
public static <T> Result<T> fail(int code, String message) {
Result<T> r = new Result<>();
r.code = code;
r.message = message;
return r;
}
// getter / setter 省略
}
自定义业务异常类
避免直接 throw new RuntimeException,而是定义继承 RuntimeException 的业务异常(如 BusinessException),携带可识别的错误码和提示信息:
- 便于分类处理(比如参数校验失败、资源不存在、权限不足等)
- 前端可根据 code 做差异化提示(如 401 跳登录页,404 显示空状态)
- 日志记录更精准,不混同于系统级异常
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
// getter 省略
}
使用 @ControllerAdvice + @ExceptionHandler 全局捕获
新建一个配置类,用 @ControllerAdvice 标记,集中处理 Controller 层抛出的异常:
立即学习“Java免费学习笔记(深入)”;
- 捕获
BusinessException→ 返回对应 code 和 message - 捕获
MethodArgumentNotValidException→ 提取 @Valid 校验失败的字段和提示 - 捕获
Exception(兜底)→ 记录日志,返回通用错误(如 500) - 注意:不要吞掉异常堆栈,生产环境需记录完整日志供排查
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result<?> handleBusinessException(BusinessException e) {
return Result.fail(e.getCode(), e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result<?> handleValidationException(MethodArgumentNotValidException e) {
String msg = e.getBindingResult()
.getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.findFirst().orElse("参数校验失败");
return Result.fail(400, msg);
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Result<?> handleUnexpectedException(Exception e) {
log.error("未预期异常", e); // 记录完整堆栈
return Result.fail(500, "服务内部错误,请稍后重试");
}
}
配合 @RestControllerAdvice 简化返回(推荐)
如果项目全部使用 REST 接口(即返回 JSON),直接用 @RestControllerAdvice 替代 @ControllerAdvice + @ResponseBody,更简洁:
- 自动为所有
@ExceptionHandler方法添加@ResponseBody - 无需每个方法手动加
@ResponseBody - 语义更明确:这是专门处理 REST 异常的增强器
同时,可在 Controller 方法中直接返回 Result.success(data),不再需要手动构造响应体,保持业务逻辑干净。


















