@controlleradvice 是 spring mvc 中用于定义 controller 层全局异常处理的注解,需配合 @exceptionhandler 使用;@restcontrolleradvice 更适合 restful 项目,自动支持 json 响应,并可通过 basepackages、annotations 等属性精准限定生效范围,异常匹配遵循子类优先原则。

@ControllerAdvice 是 Spring MVC 提供的用于定义全局增强逻辑的核心注解,专为 Controller 层设计。在全局异常处理场景中,它不直接“捕获”异常,而是声明一个类作为**异常处理的集中注册点**,配合 @ExceptionHandler 方法,实现对所有 @Controller 和 @RestController 中抛出异常的统一拦截与响应。
作用范围明确:只管 Controller 层的异常
它仅对进入 DispatcherServlet 并成功路由到 Controller 方法后、方法执行过程中抛出的异常生效。以下情况它不处理:
- 请求未到达 Controller(如 Filter 抛异常、参数解析失败早期阶段)
- 静态资源访问错误(404)、容器级错误(如 Tomcat 启动失败)
- 未被 Spring 管理的类中抛出的异常
基础写法:用 @RestControllerAdvice 更适合前后端分离项目
如果接口返回 JSON(主流 RESTful 场景),推荐直接使用 @RestControllerAdvice,它等价于 @ControllerAdvice + @ResponseBody,省去每个方法手动加 @ResponseBody 的麻烦:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public Result handleNpe(NullPointerException e) {
return Result.error("参数不能为空");
}
@ExceptionHandler(BusinessException.class)
public Result handleBiz(BusinessException e) {
return Result.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
public Result handleOther(Exception e) {
// 生产环境建议记录日志,且不返回堆栈
return Result.error(500, "服务暂不可用");
}
}
可精准控制生效范围
通过属性限制该处理器只对特定包、特定注解或特定类生效,避免影响无关模块:
-
@RestControllerAdvice(basePackages = "com.example.api"):仅处理指定包下的 Controller -
@RestControllerAdvice(annotations = RestController.class):只增强标注了@RestController的类 -
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class}):仅针对具体 Controller 类型
注意匹配优先级:越具体的异常越先执行
Spring 按照异常类型的继承关系从子类到父类匹配 @ExceptionHandler 方法。例如:
- 抛出
IllegalArgumentException→ 先匹配@ExceptionHandler(IllegalArgumentException.class) - 若无匹配 → 再尝试
@ExceptionHandler(RuntimeException.class) - 最后兜底到
@ExceptionHandler(Exception.class)
多个同级异常(如 NullPointerException 和 ArrayIndexOutOfBoundsException)之间无先后,由方法声明顺序决定(实际以 Spring 内部排序为准,建议勿依赖顺序)。










