@RestControllerAdvice 是 Spring 框架中的一个注解,它结合了 @ControllerAdvice 和 @ResponseBody 两个注解的功能。
@ControllerAdvice 用于定义全局控制器异常处理器,可以为多个控制器中的异常提供统一的处理方式。而 @ResponseBody 则表示控制器方法返回的数据直接作为 HTTP 响应体,而不是渲染为 HTML 视图。
因此,@RestControllerAdvice 的作用就是将 @ControllerAdvice 和 @ResponseBody 组合在一起,用于定义全局 RESTful 接口异常处理器,可以在多个控制器中提供统一的异常处理逻辑,并将处理结果直接返回给客户端,通常用于编写 API 接口。
在 @RestControllerAdvice 注解标记的类中,我们可以定义多个 @ExceptionHandler 注解的方法,用于处理不同的异常。这些方法需要使用 @ResponseBody 注解来指定返回的数据格式,比如 JSON、XML 等。
定义全局异常处理器
@RestControllerAdvice//结合了 @ControllerAdvice 和 @ResponseBody 两个注解的功能。
//@ControllerAdvice 用于定义全局控制器异常处理器
//@ResponseBody 则表示控制器方法返回的数据直接作为 HTTP 响应体,而不是渲染为 HTML 视图。
public class GlobalExceptionHandler {
/**
* 自定义的异常处理器
* @param e
* @return
*/
@ExceptionHandler(value = GmallException.class)
public Result gmallExceptionHandler(GmallException e) {
return Result.build(null , e.getResultCodeEnum()) ;
}
@ExceptionHandler(value = Exception.class)
public Result systemExceptionHandler(Exception e) {
return Result.build(null , ResultCodeEnum.SYSTEM_ERROR) ;
}
}
注意:需要将全局异常处理器纳入到spring容器中
导入方式1:在启动类上使用@Import注解直接进行导入
@Import(value = GlobalExceptionHandler.class)
public class ProductApplication {}
导入方式2:自定义注解对@Import导入进行数据封装, 启动类上使用自定义注解
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@Import(value = GlobalExceptionHandler.class)
public @interface EnableGlobalExceptionHandler {
}
导入方式三:spring boot自动化配置的原理就是通过@Import注解导入了一个导入器AutoConfigurationImportSelector,在该导入器中读取了spring-boot-autoconfigure包中的META-INF/spring.factories配置文件中的配置类的全类名,在这些配置类中通过@Bean定义了很多bean,并且结合spring所提供的
条件注解来决定这个bean配置是否生效。
所以:可以在resources创建META-INF/spring.factories文件,并在里面加入需要读取的配置类的全路径类名就可以不需要给启动类加注解了