JAVA 常用注解用法讲解
@ExceptionHandler
@ExceptionHandler 是 Spring MVC 框架提供的一个注解,用于声明异常处理方法。它的主要作用包括:
异常捕获: 标记的方法会在指定类型的异常发生时被调用
统一异常处理: 提供集中式的异常处理机制,避免在每个业务方法中重复编写异常处理代码
响应格式化: 将异常信息转换为统一的响应格式返回给客户端
在当前代码中,@ExceptionHandler(ApiException.class) 表示该方法专门处理 ApiException 类型及其子类的异常。
实现原理
1. 异常处理机制流程
// 当控制器中抛出 ApiException 时
@RequestMapping("/some-endpoint")
public String someMethod() {
throw new ApiException("错误信息"); // 异常发生
}
// 被 @ExceptionHandler(ApiException.class) 标记的方法会处理该异常
@ExceptionHandler(ApiException.class)
public ResponseBody<Object> handleErrorResponse(ApiException e) {
// 处理逻辑...
return responseBody; // 返回统一格式的响应
}
2. 异常解析过程
异常抛出: 当 Spring MVC 控制器方法抛出异常时
异常传播: 异常沿着调用栈向上传播到 DispatcherServlet
异常处理器查找:
Spring 查找匹配的 @ExceptionHandler 方法
优先查找当前控制器类中的处理方法
如果找不到,则查找 @RestControllerAdvice 或 @ControllerAdvice 中的处理方法
方法匹配: 根据异常类型与 @ExceptionHandler 注解中的参数进行匹配
执行处理: 执行匹配的异常处理方法
响应返回: 将处理方法的返回值作为 HTTP 响应返回
3. 匹配规则
精确匹配: @ExceptionHandler(ApiException.class) 只处理 ApiException 类型
继承关系: 如果抛出的是 ApiException 的子类,也会被该处理器捕获
多重异常: 可以指定多个异常类型: @ExceptionHandler({ApiException.class, IllegalArgumentException.class})
在当前项目中的应用价值
统一响应格式: 所有 ApiException 都会转换为标准的 ResponseBody<Object> 格式
自动填充头部信息: 自动创建 ResponseHead 并设置时间戳等信息
状态码控制: 结合 @ResponseStatus(HttpStatus.BAD_REQUEST) 自动设置 HTTP 状态码
减少重复代码: 避免在每个控制器方法中都编写相同的异常处理逻辑
这种设计模式使得整个应用程序的异常处理更加一致和可维护。
@RestControllerAdvice 注解
作用
@RestControllerAdvice 是 Spring Framework 提供的一个复合注解,用于全局异常处理和响应增强。其主要作用包括:
全局异常处理器: 使标记的类成为全局异常处理组件,处理整个应用程序中的异常
响应体增强: 自动将处理方法的返回值转换为 HTTP 响应体(内置 @ResponseBody 功能)
目标范围限定: 通过 annotations 参数精确控制该处理器适用的控制器范围
在当前代码中,@RestControllerAdvice(annotations = RestController.class) 表示该类专门处理所有标记了 @RestController 注解的控制器中抛出的异常。
实现逻辑
1. 组件注册机制
// @RestControllerAdvice 的核心逻辑
@Component
@ResponseBody
@ControllerAdvice
public @interface RestControllerAdvice {
// 继承了 @Component,因此会被 Spring 容器自动扫描和注册
// 继承了 @ResponseBody,因此方法返回值会自动序列化为 HTTP 响应体
// 继承了 @ControllerAdvice,提供了全局异常处理能力
}
2. 目标控制器筛选
通过 annotations = RestController.class 参数实现精准匹配:
只对使用 @RestController 注解标记的控制器生效
不会影响传统的 @Controller 控制器
实现了处理范围的隔离和精确控制
3. 异常处理流程
启动时注册: Spring 容器启动时扫描并注册所有 @RestControllerAdvice 标记的类
异常拦截: 当 @RestController 控制器抛出异常时,框架会查找匹配的异常处理器
方法匹配: 根据异常类型找到对应的 @ExceptionHandler 方法
执行处理: 执行异常处理逻辑并返回结果
响应序列化: 利用内置的 @ResponseBody 将返回值序列化为 HTTP 响应
在当前项目的应用价值
优势:
统一性: 为所有 RESTful API 提供一致的异常响应格式
隔离性: 不影响非 RESTful 的传统控制器
自动化: 自动注册为 Spring 组件,无需手动配置
标准化: 结合 handleErrorResponse 方法实现标准的错误响应结构
// 1. REST 控制器抛出异常
@RestController
public class SomeController {
@GetMapping("/api/test")
public String test() {
throw new ApiException("业务异常"); // 抛出异常
}
}
// 2. UniformResponseHandler 捕获并处理
// @RestControllerAdvice(annotations = RestController.class) 使其生效
// @ExceptionHandler(ApiException.class) 匹配异常类型
// 返回的 ResponseBody<Object> 自动序列化为 JSON 响应
这种设计实现了关注点分离,让业务控制器专注于业务逻辑,而异常处理交由专门的全局处理器统一管理。
更多推荐



所有评论(0)