问题现象:之前为解决异常的统一处理方式,写了异常处理切面,但是随着微服务节点越来越多,会出现每个微服务都需要单独写一个异常处理的切面,比较麻烦,因此考虑将切点可配置,切面提取到公共包内,但是几经尝试,@Aspect的方式始终无法读取配置的切点,最终使用DefaultPointcutAdvisor解决。
原理:
DefaultPointcutAdvisor是Spring默认的一个很强大的增强类,使用配置类自动注入,在配置类中获取切点的配置,即可实现以上需求。
代码:
先定义增强的功能
public class ExceptionAop implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object proceed = null;
try {
proceed = invocation.proceed();
} catch (Exception e) {
ResultDTO resultDTO = ErrorUtil.getResultDTO(e);
BaseException baseException = new BaseException(resultDTO.getErrorNo().toString());
baseException.setReturnCode(resultDTO.getErrorNo().toString());
baseException.setErrorMessage(resultDTO.getErrorInfo());
throw baseException;
}
return proceed;
}
}
接着讲DefaultPointcutAdvisor初始化并加入容器
@Configuration
@ConditionalOnProperty(name = "aop.exception.pointcut")
public class AopConfig {
private Logger logger = LoggerFactory.getLogger(AopConfig.class);
@Value("${aop.exception.pointcut}")
private String exceptionExecution;
/**
* 异常的切面
* @return
*/
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor2() {
ExceptionAop interceptor = new ExceptionAop();
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(exceptionExecution);
// 配置增强类advisor
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
advisor.setPointcut(pointcut);
advisor.setAdvice(interceptor);
logger.info("Add exception aop");
return advisor;
}
}
这里遍可以实现读取配置文件的切点
#异常处理切点
aop.exception.pointcut=execution(* com.mumu.trade.*.impl.*.*(..))
遗留问题: