深入理解@RestControllerAdvice:全局异常捕获与处理

1,723 阅读2分钟

深入理解@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的错误响应格式,是构建企业级应用不可或缺的组件。理解其底层依赖和协作机制,有助于更灵活地进行定制化开发。