ControllerAdivce和RestControllerAdvice
时间: 2025-01-04 14:30:37 浏览: 6
### ControllerAdvice 和 RestControllerAdvice 的区别及用法
#### 定义与作用范围
`@ControllerAdvice` 是一个全局异常处理机制,可以用于捕获控制器中的异常并提供统一的错误响应。此注解能够应用于任何带有 `@RequestMapping`, `@GetMapping`, `@PostMapping` 等注解的方法所在的类上[^1]。
```java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFound(final ResourceNotFoundException ex) {
final ErrorResponse errorResponse = new ErrorResponse("NOT_FOUND", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
}
```
另一方面,`@RestControllerAdvice` 实际上是组合了 `@ControllerAdvice` 和 `@ResponseBody` 注解的功能。这意味着当使用 `@RestControllerAdvice` 时,默认情况下返回的内容会被自动转换成 JSON 或 XML 形式的 HTTP 响应体发送给客户端,而不需要显式地标记方法为 `@ResponseBody`[^2]。
```java
@RestControllerAdvice
public class ApiGlobalExceptionHandler {
@ExceptionHandler(ApiException.class)
public ErrorInfo apiErrorHandle(ApiException e){
log.error(e.getLocalizedMessage(),e);
return new ErrorInfo(500,"服务器内部错误");
}
}
```
#### 主要差异点
- **默认行为**: 使用 `@RestControllerAdvice` 可以省去每次都要加上的 `@ResponseBody` 标签;而对于普通的 `@ControllerAdvice` 来说,则需要单独指定。
- **适用场景**: 如果应用程序主要是 RESTful API 接口服务,并且希望所有的异常都通过 JSON/XML 返回给调用者的话,那么推荐使用 `@RestControllerAdvice`。对于混合型应用(既有视图渲染又有API接口),则可以选择更灵活的方式——即针对不同类型的请求分别采用不同的策略来定义相应的 Advice 类[^3].
阅读全文