@RestControllerAdvice
和 @ControllerAdvice
都是 Spring 框架中的注解,用于定义全局的异常处理、数据绑定、模型属性共享等功能。它们的区别主要体现在返回值的处理和适用的场景。
1. @ControllerAdvice
-
功能:
@ControllerAdvice
是 Spring MVC 提供的全局异常处理机制,它可以在整个应用程序中全局处理控制器抛出的异常,并且能够统一处理返回的数据和错误响应。@ControllerAdvice
可以用于设置全局的模型属性、数据绑定、拦截控制器方法的参数等。
-
适用场景:
- 适用于传统的 MVC 模式(即页面渲染),通常会处理模型数据并返回视图(例如
ModelAndView
)。
- 适用于传统的 MVC 模式(即页面渲染),通常会处理模型数据并返回视图(例如
-
返回类型:
@ControllerAdvice
处理的异常会返回ModelAndView
,即返回的是一个 视图。- 适用于返回页面的控制器。
-
示例代码:
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {// 全局处理异常@ExceptionHandler(Exception.class)public String handleException(Exception ex, Model model) {model.addAttribute("error", ex.getMessage());return "error"; // 返回一个视图名称}
}
在这个例子中,当出现异常时,Spring 会返回一个视图名 "error"
,并将错误信息通过 Model
对象传递给视图。
2. @RestControllerAdvice
-
功能:
@RestControllerAdvice
是@ControllerAdvice
的一个变种,它是专门为 RESTful API 提供的功能,适用于返回 JSON 或其他格式的数据。@RestControllerAdvice
主要用于全局处理异常,并返回 JSON 格式的错误信息或数据。
-
适用场景:
- 适用于 REST API 的开发,处理的是 JSON 响应,而不是视图。
-
返回类型:
@RestControllerAdvice
默认返回的是 JSON 格式的数据。与@ControllerAdvice
不同,它不返回视图,而是返回 ResponseEntity 或 Java 对象,自动转化为 JSON 格式。
-
示例代码:
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionHandler {// 全局处理异常@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return ResponseEntity.status(500).body("Error: " + ex.getMessage()); // 返回 JSON 格式的响应}
}
在这个例子中,当出现异常时,Spring 会返回一个包含错误信息的 JSON 响应。
3. 主要区别
特点 | @ControllerAdvice | @RestControllerAdvice |
---|---|---|
返回类型 | 默认返回 视图名称(例如 ModelAndView 或视图模板) | 默认返回 JSON 格式的数据(或其他格式,如 XML) |
适用场景 | 用于传统的 MVC 应用程序,处理页面和视图 | 用于 RESTful API 应用程序,返回数据(JSON 格式) |
注解组合 | 可以与 @ResponseBody 配合使用,返回 JSON 或 XML 格式的数据 | 默认具备 @ResponseBody 功能,无需显式标注 |
常见用途 | 处理页面渲染中的异常和全局数据绑定,模型属性共享 | 处理 REST API 中的异常并返回统一的错误响应 |
功能区别 | 主要用于 @ModelAttribute 、@ExceptionHandler 等处理 | 主要用于 @ExceptionHandler ,返回 REST API 错误响应数据 |
4. 实际应用
- 如果你是开发一个 传统的 Web 应用(即使用视图模板如 JSP 或 Thymeleaf),你会使用
@ControllerAdvice
。 - 如果你开发的是 RESTful API(通常是返回 JSON 数据),则使用
@RestControllerAdvice
,这样它会自动将错误信息以 JSON 格式返回给客户端,而不需要额外的配置。
5. 如何选择使用哪一个?
- 如果你的应用程序是一个传统的 Web 应用,你应该选择
@ControllerAdvice
来处理异常、全局数据绑定等。 - 如果你的应用程序是一个 RESTful API,你应该选择
@RestControllerAdvice
来处理异常,并返回 JSON 格式的数据响应。
总结来说,@RestControllerAdvice 相当于 @ControllerAdvice + @ResponseBody,它默认会返回响应体的数据(通常是 JSON 格式),而 @ControllerAdvice 适合用于传统的 Web 应用,返回视图或模型数据。