全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

Spring MVC @ControllerAdvice注解

@ControllerAdvice 用于定义全局的控制器增强,其方法应用于所有控制器。

注解组合

组合注解等价于用途
@RestControllerAdvice@ControllerAdvice + @ResponseBodyREST API 全局处理

全局异常处理

Java
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public Result<Void> handleBusiness(BusinessException ex) {
        return Result.fail(ex.getCode(), ex.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Void> handleValidation(MethodArgumentNotValidException ex) {
        String message = ex.getBindingResult()
                          .getFieldErrors()
                          .stream()
                          .map(FieldError::getDefaultMessage)
                          .collect(Collectors.joining(", "));
        return Result.fail(400, message);
    }

    @ExceptionHandler(Exception.class)
    public Result<Void> handleException(Exception ex) {
        log.error("系统异常", ex);
        return Result.fail(500, "系统异常");
    }
}

全局模型属性

Java
@ControllerAdvice
public class GlobalModelAttribute {

    @ModelAttribute("currentUser")
    public User currentUser(HttpServletRequest request) {
        return (User) request.getSession().getAttribute("user");
    }
}

所有视图都可访问 ${currentUser}

全局数据绑定

Java
@ControllerAdvice
public class GlobalBinder {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 注册自定义编辑器
        binder.registerCustomEditor(Date.class,
            new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));

        // 注册自定义验证器
        binder.addValidators(new CustomValidator());
    }
}

限定作用范围

Java
// 限定包范围
@ControllerAdvice("com.example.web")

// 限定注解范围
@ControllerAdvice(annotations = RestController.class)

// 限定类范围
@ControllerAdvice(basePackageClasses = UserController.class)

异常处理优先级

Java
控制器内 @ExceptionHandler > @ControllerAdvice @ExceptionHandler

多个 @ControllerAdvice 的优先级通过 @Order 控制:

text
@Order(1)
@RestControllerAdvice
public class HighPriorityExceptionHandler {
    // 高优先级
}

@Order(2)
@RestControllerAdvice
public class LowPriorityExceptionHandler {
    // 低优先级
}

@ControllerAdvice 默认对所有控制器生效,可通过属性限定范围。

要点总结

  • @ControllerAdvice 定义全局控制器增强
  • 配合 @ExceptionHandler 实现全局异常处理
  • 配合 @ModelAttribute 添加全局模型属性
  • 配合 @InitBinder 配置全局数据绑定

📝 发现内容有误?点击此处直接编辑

← 上一篇 转发与重定向
下一篇 → Spring MVC @Controller注解
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库