Java 环绕通知怎么拿到@ExceptionHandler(value = RuntimeException.class)的返回值
时间: 2024-02-06 22:09:09 浏览: 88
基于Spring Boot的Guns前后端分离框架设计源码
在 Java 的环绕通知中,可以使用 ProceedingJoinPoint 对象的 proceed() 方法来执行目标方法,并且可以获取目标方法的返回值。如果目标方法执行时抛出了异常,并且有对应的异常处理方法(如 @ExceptionHandler 注解所标注的方法),则可以在环绕通知中捕获该异常,并且调用异常处理方法返回的值。
以下是一个示例代码:
```java
@Around("execution(* com.example.MyController.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
try {
result = joinPoint.proceed(); // 执行目标方法,获取返回值
} catch (Exception e) {
// 捕获目标方法抛出的异常,并且调用异常处理方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
if (method.isAnnotationPresent(ExceptionHandler.class)) {
ExceptionHandler exceptionHandler = method.getAnnotation(ExceptionHandler.class);
Class<?>[] exceptions = exceptionHandler.value();
for (Class<?> exception : exceptions) {
if (exception.isAssignableFrom(e.getClass())) {
Object handler = applicationContext.getBean(method.getDeclaringClass());
result = method.invoke(handler, e);
break;
}
}
} else {
throw e; // 没有对应的异常处理方法,继续抛出异常
}
}
return result;
}
```
在上述代码中,我们首先通过 ProceedingJoinPoint 对象的 proceed() 方法执行目标方法,并且获取目标方法的返回值。如果目标方法执行时抛出了异常,我们会捕获该异常,并且调用对应的异常处理方法。在调用异常处理方法时,我们需要使用反射来获取该方法,并且通过 invoke() 方法来调用该方法并且获取返回值。最终,我们将返回值返回给调用方。
阅读全文