Выражение выполнения Spring AOP с двумя аргументами

#spring-boot #aop #aspectj #spring-aop

#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)
  

и извлеките два аргумента : pendingTrx , globalTrxId для использования в методе advice.

Я использую следующее выражение выполнения:

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

Приложение успешно построено, но код рекомендации не выполняется.

Я использую Spring boot с @EnableAspectJAutoProxy(proxyTargetClass=true) в своем классе конфигурации.

Кстати, у меня есть @AfterThrowing совет по правильному запуску. Поэтому я очень думаю, что проблема в моем выражении выполнения.

Обновление: у меня очень странное открытие: когда я использую любой аргумент типа String, совет не работает, в противном случае (длинный или двойной) он работает.

есть какие-либо объяснения?

Ответ №1:

Это работает для меня, используя @Around :

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

Я думаю, что ваша ошибка заключается в порядке ваших аргументов:

  • вы указали: args(pendingTrx,globalTrxId,..)
  • и это должно быть args(.., pendingTrx,globalTrxId)

Комментарии:

1. спасибо million…do у вас есть какой-либо документ для языка выражения аргументов метода в AOP, потому что у меня все еще похожие проблемы.

2. Я использовал это в качестве ссылки: docs.spring.io/spring/docs/current/spring-framework-reference /…

3. В моем случае не добавление аргументов к определению pointcut приводит к следующему исключению:ошибка при ::0 formal unbound в pointcut в org.aspectj.weaver.tools. PointcutParser.parsePointcutExpression(PointcutParser.java:319) ~[aspectjweaver-1.9.4.jar:na]