Spring AOP执行表达式有两个参数

时间:2016-10-23 12:05:04

标签: spring-boot aop aspectj spring-aop

我想建议以下方法

public BaseRepresentationObject createLedgerTransaction(Long fromUserId, Long toUserId, Double serviceAmount,
        Double masaryCommission, Double merchantCommission, Double appliedFees, Double tax, Long ratePlanId,
        Long serviceId, String pendingTrx, String globalTrxId)

并提取两个参数:pendingTrxglobalTrxId以在advice方法中使用。

我使用以下执行表达式:

@Around("execution(* com.masary.ledger.service.components.LedgerTransactionComponent.createLedgerTransaction(..)) && args(pendingTrx,globalTrxId,..)")
    public Object doBasicProfilingLedgerCreate(final ProceedingJoinPoint pjp , String pendingTrx, String globalTrxId) throws Throwable 

应用程序已成功构建,但建议代码未执行。

我在配置类上使用@EnableAspectJAutoProxy(proxyTargetClass=true)进行Spring启动。

顺便说一句,我有@AfterThrowing建议正确运行。所以我高度认为问题出在我的执行表达式上。

更新 我有一个非常奇怪的发现:当我使用String类型的任何参数时,建议不起作用,否则(长或双)它起作用。

任何解释?

1 个答案:

答案 0 :(得分:0)

这适用于我,使用@Around

@Aspect
@Component
public class MyAspect {
    @Around("execution (* com.masary.ledger.service.components.LedgerTransactionComponent.createLedgerTransaction(..)) && args(.., pendingTrx, globalTrxId)")
    public Object aroundCreateLedgerTransaction(ProceedingJoinPoint pjp, String pendingTrx, String globalTrxId) throws Throwable{
        System.out.println("it works!");
        return pjp.proceed();
    }
}

@Around@Pointcut

@Aspect
@Component
public class MyAspect {

    @Pointcut("execution (* com.masary.ledger.service.components.LedgerTransactionComponent.createLedgerTransaction(..))")
    public void pointcutCreateLedgerTransaction(){}

    @Around("pointcutCreateLedgerTransaction() && args(.., pendingTrx, globalTrxId)")
    public Object aroundCreateLedgerTransaction(ProceedingJoinPoint pjp, String pendingTrx, String globalTrxId) throws Throwable{
        System.out.println("it works!");
        return pjp.proceed();
    }
}

认为你的错误是你args的顺序:

  • 您指定了:args(pendingTrx,globalTrxId,..)
  • ,应为args(.., pendingTrx,globalTrxId)