深入理解@RestControllerAdvice:全局异常捕获与处理
在Spring Boot应用中,统一异常处理是构建健壮RESTful API的关键。@RestControllerAdvice是Spring框架提供的强大工具,结合@ExceptionHandler可实现全局异常拦截。这篇文章我们会聚焦这一点,谈谈这种实现业务与异常解耦的策略。
一、@RestControllerAdvice 基础使用
1. 定义全局异常处理器
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleUserNotFound(UserNotFoundException ex) {
return new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.value());
}
}
2. 自定义异常类
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
3. 测试Controller
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
if (id == 0) {
throw new UserNotFoundException("用户不存在");
}
return "用户信息";
}
}
4. 统一响应体
@Data
@AllArgsConstructor
public class ErrorResponse {
private String message;
private int statusCode;
}
访问/users/0将触发异常,返回:
{
"message": "用户不存在",
"statusCode": 404
}
二、问题解答
1. 为什么@RestControllerAdvice常与@RestController配合使用?
- 响应格式统一性:二者均基于
@ResponseBody,确保异常处理结果与业务逻辑返回同为JSON格式。 - 作用域明确:
@RestControllerAdvice默认处理所有@RestController控制器抛出的异常,保持REST API异常处理的专一性。 - 避免视图解析:传统
@Controller可能返回视图,而@RestControllerAdvice专注于数据响应。
2. @RestControllerAdvice的依赖来源?
该注解属于Spring Web模块,在项目中需引入:
<!-- Maven -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
或Gradle:
implementation 'org.springframework.boot:spring-boot-starter-web'
三、核心机制解析
- 组合注解:
@RestControllerAdvice = @ControllerAdvice + @ResponseBody - AOP代理:通过动态代理技术拦截控制器方法调用,在异常抛出时匹配处理策略。
- 优先级规则:更具体的异常处理器优先于通用处理器。
四、总结
@RestControllerAdvice通过集中管理异常处理逻辑,显著提升代码可维护性。结合@RestController使用时,能够有效统一REST API的错误响应格式,是构建企业级应用不可或缺的组件。理解其底层依赖和协作机制,有助于更灵活地进行定制化开发。