全部学科
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 @ExceptionHandler注解
下一篇 → 静态资源映射配置
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码