开发中,多个接口处理业务时,若发生异常,希望可以统一处理这些异常,这时就可以把异常抛出,使用切面统一处理.
使用Springboot开发,不需要其他配置.导入依赖即可
<!--aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Around:可以手动调用切点方法,这样就可以在接口方法执行的前,中,后进行相关的业务处理.
@Aspect
@Slf4j
@Component
public class GlobalExceptionAspectForRpc {
/**
*
* 由于spring 的全局异常处理只能对http请求有效,所以对于rpc的调用不起作用。
* 所以:我们采用自定义切面的方法
* @param joinPoint
* @throws Throwable
*/
@Around("execution(* com.test.controller.*.*(..))")
public Object printException (ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
try{
//获得类名
String clazzName = joinPoint.getTarget().getClass().getSimpleName();
//获得方法名
String methodName = joinPoint.getSignature().getName();
//获得参数列表
Object[] args = joinPoint.getArgs();
log.info("clazzName:{},methodName:{},args:{}",clazzName,methodName,args.length > 0 ? args[0] : null);
//执行切点,就是* com.mlsama.springbootoracle.service..*.*(..)表达式匹配的方法
result = joinPoint.proceed();
} catch (Throwable e) {
log.error("发生异常:{}",e);
//处理异常:对于rpc异常来说,可以统一异常返回
//对于http异常,可以继续抛出,由RestControllerAdvice 的GlobalExceptionHandler处理器去处理
throw e;
}
log.info("result:{}",result);
return result;
}
}