当前位置: 首页 > news >正文

spring mvc 异常处理中@RestControllerAdvice 和 @ControllerAdvice 对比详解

@RestControllerAdvice 和 @ControllerAdvice 对比详解


1. 基本概念
注解等效组合核心作用
@ControllerAdvice@Component + @RequestMapping(隐式)定义全局控制器增强类,处理跨控制器的异常、数据绑定或全局响应逻辑。
@RestControllerAdvice@ControllerAdvice + @ResponseBody继承 @ControllerAdvice,并默认将返回值序列化为 HTTP 响应体(如 JSON)。

2. 核心区别
对比维度@ControllerAdvice@RestControllerAdvice
返回值处理默认返回视图名称(需配合 @ResponseBody 才能序列化)直接返回数据对象,自动序列化为响应体(如 JSON)
适用场景传统 MVC 应用(如返回 HTML 视图或混合响应)RESTful API(需返回 JSON/XML 格式数据)
注解组合需手动添加 @ResponseBody 才能返回 JSON内置 @ResponseBody,无需额外声明
返回类型示例String(视图名称)、ModelAndViewResponseEntity, Map, 自定义 POJO

3. 代码示例对比
场景:全局异常处理

@ControllerAdvice 示例(返回视图名称)

@ControllerAdvice
public class GlobalViewExceptionHandler {
    @ExceptionHandler(IOException.class)
    public String handleIOException() {
        return "error/500"; // 返回视图名称(如 Thymeleaf 模板)
    }
}

@RestControllerAdvice 示例(返回 JSON)

@RestControllerAdvice
public class GlobalApiExceptionHandler {
    @ExceptionHandler(IOException.class)
    public ResponseEntity<ErrorDetails> handleIOException() {
        ErrorDetails error = new ErrorDetails(500, "Internal Server Error", null);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
    }
}

4. 关键功能对比
功能@ControllerAdvice@RestControllerAdvice
异常处理支持,需手动定义返回类型(视图或 JSON)支持,直接返回 JSON 格式错误对象
数据绑定可通过 @InitBinder 统一配置绑定规则同样支持 @InitBinder,但返回值默认序列化
全局方法增强可通过 @ModelAttribute 注入公共数据同样支持,但返回数据自动序列化
响应体控制需显式使用 @ResponseBodyResponseEntity内置 @ResponseBody,无需额外声明

5. 配置与扩展
共同特性
  • 包级作用域:通过 basePackages 指定需要增强的控制器包:

    @ControllerAdvice(basePackages = "com.example.controllers")
    
  • 方法级过滤:通过 annotations 指定仅处理特定注解的控制器:

    @ControllerAdvice(annotations = RestController.class)
    
差异点
  • 响应体格式
    • @ControllerAdvice 需显式配置 @ResponseBodyResponseEntity 才能返回 JSON:

      @ControllerAdvice
      public class MixHandler {
          @ResponseBody // 显式声明返回 JSON
          @ExceptionHandler(IOException.class)
          public ErrorDetails handleIOException() { ... }
      }
      
    • @RestControllerAdvice 默认支持序列化:

      @RestControllerAdvice
      public class ApiHandler {
          @ExceptionHandler(IOException.class)
          public ErrorDetails handleIOException() { ... } // 自动序列化为 JSON
      }
      

6. 典型使用场景
场景推荐注解原因
传统 Web 应用(返回 HTML)@ControllerAdvice需返回视图名称(如 Thymeleaf 模板路径)。
RESTful API 异常处理@RestControllerAdvice直接返回结构化的 JSON 错误信息,无需额外配置 @ResponseBody
混合场景(需同时处理视图和 JSON)@ControllerAdvice需通过 @ResponseBody 区分返回类型,或使用 ResponseEntity 控制响应格式。

7. 总结表格
维度@ControllerAdvice@RestControllerAdvice
核心作用全局异常处理、数据绑定、视图增强专为 REST API 设计,返回 JSON 格式响应
返回值默认行为返回视图名称或需 @ResponseBody 显式声明直接返回数据对象,自动序列化为响应体
适用场景传统 MVC 应用、混合响应场景纯 REST API 开发(如 Spring Boot 微服务)
注解组合关系独立注解,需手动配置响应格式等效于 @ControllerAdvice + @ResponseBody

关键总结

  1. 选择原则
    • REST API:优先使用 @RestControllerAdvice,简化 JSON 响应处理。
    • 传统 MVC:使用 @ControllerAdvice,灵活控制视图或 JSON 响应(需配合 @ResponseBody)。
  2. 注意事项
    • @ControllerAdvice 若需返回 JSON,必须显式添加 @ResponseBody 或使用 ResponseEntity
    • @RestControllerAdvice 内置 @ResponseBody,无需额外声明,适合统一 API 响应格式。
  3. 最佳实践
    • 对于纯 API 项目,用 @RestControllerAdvice 集中处理异常和响应。
    • 在混合项目中,通过 basePackages 区分不同场景的增强类。
http://www.dtcms.com/a/122438.html

相关文章:

  • Linux服务器——Samba服务器
  • 【C++编程基础-关键字】:constexpr和const
  • Vue3服务端渲染实战:Nuxt3深度解析与高性能SSR架构设计
  • vLLM实战:多机多卡大模型分布式推理部署全流程指南
  • 深入探究Python的re模块及其在爬虫中的应用
  • 界面控件DevExpress WPF v25.1新功能预览 - 数据网格、报表性能增强
  • [特殊字符] Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元!
  • ARM裸机全集学习笔记【链接来源:向阳而生,逆风翻盘】
  • 智能家居设备
  • Ansible(5)——编写 Playbook
  • SpringMVC的请求-文件上传
  • 如何利用 Java 爬虫获取京东商品详情信息
  • scala总结与spark安装
  • 游戏引擎学习第213天
  • 【scikit-learn基础】--『预处理』之 正则化
  • JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端
  • 21 天 Python 计划:MySQL中DML与权限管理
  • Java基础 4.9
  • 如何生成一个requestid
  • 地图服务热点追踪:创新赋能,领航出行与生活
  • Windows 下 Rust 安装全攻略(无需 Visual Studio)
  • 【力扣hot100题】(078)跳跃游戏Ⅱ
  • 用 npm list -g --depth=0 探索全局包的秘密 ✨
  • MySQL中使用索引一定有效吗?如何排查索引效果?
  • uniapp uni-collapse动态切换数据时高度不能自适应
  • 旅行世界宠物养殖合成游戏源码
  • SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用
  • 银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路
  • 蓝桥杯 B3619 10 进制转 x 进制
  • 4.7学习总结 可变参数+集合工具类Collections+不可变集合