@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" ; }
}
@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 注入公共数据 同样支持,但返回数据自动序列化 响应体控制 需显式使用 @ResponseBody 或 ResponseEntity 内置 @ResponseBody,无需额外声明
5. 配置与扩展
共同特性
包级作用域 :通过 basePackages 指定需要增强的控制器包:
@ControllerAdvice ( basePackages = "com.example.controllers" )
方法级过滤 :通过 annotations 指定仅处理特定注解的控制器:
@ControllerAdvice ( annotations = RestController . class )
差异点
响应体格式 : @ControllerAdvice 需显式配置 @ResponseBody 或 ResponseEntity 才能返回 JSON:
@ControllerAdvice
public class MixHandler { @ResponseBody @ExceptionHandler ( IOException . class ) public ErrorDetails handleIOException ( ) { . . . }
}
@RestControllerAdvice 默认支持序列化:
@RestControllerAdvice
public class ApiHandler { @ExceptionHandler ( IOException . class ) public ErrorDetails handleIOException ( ) { . . . }
}
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
关键总结
选择原则 : REST API :优先使用 @RestControllerAdvice,简化 JSON 响应处理。传统 MVC :使用 @ControllerAdvice,灵活控制视图或 JSON 响应(需配合 @ResponseBody)。 注意事项 : @ControllerAdvice 若需返回 JSON,必须显式添加 @ResponseBody 或使用 ResponseEntity。@RestControllerAdvice 内置 @ResponseBody,无需额外声明,适合统一 API 响应格式。 最佳实践 : 对于纯 API 项目,用 @RestControllerAdvice 集中处理异常和响应。 在混合项目中,通过 basePackages 区分不同场景的增强类。