Spring AOP:@AfterThrowing执行切入点永远不会匹配

我对AOP完全陌生。 我需要建议来编写正确的切入点。 我有一个包含所有服务类的服务包。 所有的类都实现了Service接口。 这个接口有一个方法save(entity) 。 每次service.save(entity)方法抛出DataIntegrityViolationException时,都应执行我的建议。

在这方面:

@Component
@Aspect
public class DIVExceptionHandler {
    @AfterThrowing(pointcut = "execution(* myPackage.service.Service.save(*))", throwing = "ex")
        public void handleException(JoinPoint joinPoint, DataIntegrityViolationException ex) {
        //snipped
    }
}

正如Spring AOP文档中所解释的,我在CP中都有aspectj jars,并且我在Spring配置中添加了<aop:aspectj-autoproxy/> ,并且正在使用组件扫描。 在测试的日志中,我可以看到该方面被检测为aspetcj方面:

DEBUG o.s.a.a.a.ReflectiveAspectJAdvisorFactory - Found AspectJ method...

所以我相信这不是一个配置问题,我的切入点表达是错误的。 我也试过了

@AfterThrowing(pointcut = "execution(* myPackage.service.*.save(*))", throwing = "ex")

但是那也行不通。

那么什么是正确的切入点表达式?


它实际上是一个配置问题。

@AfterThrowing(pointcut = "execution(* myPackage.service.Service.save(*))", throwing = "ex")

工作正常。

实际的问题是DataIntegrityViolationException仅在@Transactional的代理完成该事务之后抛出。 在我的情况下,这发生在我的建议可以被调用后。

解决方案是将一个订单属性添加到交易配置中:

<tx:annotation-driven transaction-manager="transactionManager" order="2000"/>

然后为您的方面添加@Order注释,该注释小于交易的方面:

@Component
@Order(1500) // must be less than order of <tx:annotation-driven />
@Aspect
public class DIVExceptionHandler {
    @AfterThrowing(pointcut = "execution(* myPackage.service.Service.save(*))", throwing = "ex")
        public void handleException(JoinPoint joinPoint, DataIntegrityViolationException ex) {
        //snipped
    }
}

看到:

Spring AOP排序 - 建议之前的事务

链接地址: http://www.djcxy.com/p/77251.html

上一篇: Spring AOP: @AfterThrowing execution pointcut never matches

下一篇: Spring aspectj annotation pointcut