一、@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" 和默认错误信息。这样可以将异常处理从业务代码中分离出来,使得代码更加清晰和易于维护。
四、总结
全局异常捕获是一种处理系统中出现异常情况的机制,可以让我们更加准确地定位和解决系统中的问题。全局异常捕获的作用主要有以下几个方面:
统一错误处理:通过全局异常捕获机制,我们可以设置统一的异常处理方式,使得整个系统的异常信息输出样式、错误码等都保持一致,便于开发人员快速处理异常。
方便排查问题:通过统一的异常处理机制,我们可以将系统的异常信息全部写入日志文件,便于开发人员在出现问题的时候快速定位和排查问题。
提高代码可维护性:全局异常捕获可以减少代码冗余和重复,统一异常处理的方式和代码块可以让代码更易于维护。
提高系统的健壮性:通过全局异常捕获机制,我们可以处理大部分的可能出现的异常情况,并将系统的错误信息输出给用户。这样可以有效地提高系统的健壮性和可用性。