一、@RestControllerAdvice 注解的基础使用
我们先来看一下 @RestControllerAdvice
注解的基本使用方法。
在 Spring Boot 项目中,可以通过在类上添加 @RestControllerAdvice 注解来定义全局的异常处理类,如下所示:
@RestControllerAdvice
public class GlobalExceptionHandler {
//处理所有异常
@ExceptionHandler(Exception.class)
public ResultBean exceptionHandler(Exception e) {
return new ResultBean<>("0001", e.getMessage());
}
}
在上述代码中,我们定义了一个名为 GlobalExceptionHandler 的异常处理类,并使用 @RestControllerAdvice 注解来标识该类为全局异常处理类。在该类中,我们使用 @ExceptionHandler 注解来指定该方法要处理的异常类型,在本例中是 Exception 类型的异常。当出现 Exception 类型的异常时,Spring Boot 会自动调用 exceptionHandler 方法来处理异常,并返回 ResultBean 类型的结果
。
二、@RestControllerAdvice 中的参数绑定
在实际开发中,我们经常需要在异常处理方法中获取一些请求参数,以便我们能够更好地处理异常。Spring Boot 可以通过将请求参数绑定到方法的参数上来轻松地实现这一点。
例如,我们需要获取请求中的 token 参数可以在异常处理方法中添加 @RequestParam 注解:
@RestControllerAdvice
public class GlobalExceptionHandler {
//处理token过期异常
@ExceptionHandler(TokenExpiredException.class)
public ResultBean tokenExpiredExceptionHandler(TokenExpiredException e) {
return new ResultBean<>("0002", "token过期,请重新登录");
}
}
三、@RestControllerAdvice 中使用 AOP
在实际开发中,我们还可以结合 AOP 的思想,将异常处理代码从业务代码中分离出来,从而进一步提高程序的可维护性和可读性
。
我们来看一个简单的示例:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class)
public ResultBean myExceptionHandler(MyException e) {
return new ResultBean<>("0004", e.getMessage());
}
@Around("execution(public * com.example.demo.controller.*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
Object result = null;
try {
result = pjp.proceed();
} catch (Exception e) {
if (e instanceof MyException) {
result = new ResultBean<>("0004", "自定义异常");
} else {
result = new ResultBean<>("0005", "未知异常");
}
}
return result;
}
}
在上述代码中,我们定义了一个环绕通知,在所有的 Controller 方法中,执行代码之前都会先执行该通知。在该通知中,我们可以通过调用 pjp.proceed() 执行被代理的方法,如果出现异常,则根据异常类型做出不同的处理。如果是 MyException 异常,则返回代码 "0004" 和异常信息,否则返回代码 "0005" 和默认错误信息。这样可以将异常处理从业务代码中分离出来,使得代码更加清晰和易于维护。
四、总结
全局异常捕获是一种处理系统中出现异常情况的机制,可以让我们更加准确地定位和解决系统中的问题。全局异常捕获的作用主要有以下几个方面:
统一错误处理
:通过全局异常捕获机制,我们可以设置统一的异常处理方式,使得整个系统的异常信息输出样式、错误码等都保持一致,便于开发人员快速处理异常。
方便排查问题
:通过统一的异常处理机制,我们可以将系统的异常信息全部写入日志文件,便于开发人员在出现问题的时候快速定位和排查问题。
提高代码可维护性
:全局异常捕获可以减少代码冗余和重复,统一异常处理的方式和代码块可以让代码更易于维护。
提高系统的健壮性
:通过全局异常捕获机制,我们可以处理大部分的可能出现的异常情况,并将系统的错误信息输出给用户。这样可以有效地提高系统的健壮性和可用性。