一、@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" 和默认错误信息。这样可以将异常处理从业务代码中分离出来,使得代码更加清晰和易于维护。

四、总结

全局异常捕获是一种处理系统中出现异常情况的机制,可以让我们更加准确地定位和解决系统中的问题。全局异常捕获的作用主要有以下几个方面:

统一错误处理:通过全局异常捕获机制,我们可以设置统一的异常处理方式,使得整个系统的异常信息输出样式、错误码等都保持一致,便于开发人员快速处理异常。

方便排查问题:通过统一的异常处理机制,我们可以将系统的异常信息全部写入日志文件,便于开发人员在出现问题的时候快速定位和排查问题。

提高代码可维护性:全局异常捕获可以减少代码冗余和重复,统一异常处理的方式和代码块可以让代码更易于维护。

提高系统的健壮性:通过全局异常捕获机制,我们可以处理大部分的可能出现的异常情况,并将系统的错误信息输出给用户。这样可以有效地提高系统的健壮性和可用性。