@ControllerAdvice 是 Spring MVC 用于全局异常处理、数据绑定和模型属性增强的组件,可统一捕获多个控制器异常,支持按包过滤、多异常类型分治、标准响应格式返回及上下文信息注入。

@ControllerAdvice 是 Spring MVC 提供的用于定义全局异常处理、数据绑定或模型属性增强的组件。它能统一捕获多个控制器(@Controller 或 @RestController)抛出的异常,避免在每个 Controller 中重复写 try-catch,提升代码可维护性。
基本用法:定义全局异常处理器
创建一个类,加上 @ControllerAdvice 注解,并配合 @ExceptionHandler 方法来捕获特定异常:
- 该类默认作用于所有
@Controller和@RestController - 可加
basePackages属性限定生效的包范围,例如:@ControllerAdvice(basePackages = "com.example.web") - 方法返回值会自动适配为 HTTP 响应体(如 JSON),前提是类上也加了
@ResponseBody,或者直接使用@RestControllerAdvice(它是@ControllerAdvice + @ResponseBody的组合注解)
捕获不同类型的异常
一个 @ControllerAdvice 类中可以定义多个 @ExceptionHandler 方法,分别处理不同异常:
- 处理自定义业务异常(如
BusinessException):返回友好提示和状态码 400 - 捕获
NullPointerException等运行时异常:记录日志并返回 500 错误响应 - 处理
MethodArgumentNotValidException:用于校验失败(如@Valid注解触发)时提取错误字段信息 - 兜底处理
Exception:作为最后的异常捕获,避免未处理异常穿透到容器
返回结构化错误响应
建议统一返回标准错误格式(如包含 code、message、timestamp、path),便于前端解析:
立即学习“Java免费学习笔记(深入)”;
- 定义一个通用响应类(如
Result<T>或ErrorResponse) - 在
@ExceptionHandler方法中构造该对象并返回 - 配合
@ResponseStatus指定 HTTP 状态码,例如:@ResponseStatus(HttpStatus.BAD_REQUEST) - 若需访问请求路径、HTTP 方法等上下文信息,方法参数可注入
HttpServletRequest或WebRequest
注意事项与常见问题
实际使用中容易忽略以下细节:
- 确保该类被 Spring 扫描到(放在主启动类同包或子包下,或显式配置
@ComponentScan) -
@ControllerAdvice不处理过滤器(Filter)、拦截器(Interceptor)或 AOP 中抛出的异常 - 若同时存在多个
@ControllerAdvice,可通过@Order或实现Ordered接口控制优先级 - 在 WebFlux(响应式栈)中应使用
@ControllerAdvice配合WebExceptionHandler,而非传统方式


















