Выражение выполнения 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 для использования в методе совета.

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

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

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

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

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

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

любое объяснение?


person Shady Ragab    schedule 23.10.2016    source источник


Ответы (1)


Это работает для меня, используя @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(pendingTrx,globalTrxId,..)
  • а должно быть args(.., pendingTrx,globalTrxId)
person alexbt    schedule 23.10.2016
comment
спасибо миллион ... у вас есть какой-либо документ для языка выражения аргументов метода в АОП, потому что у меня все еще есть похожие проблемы. - person Shady Ragab; 24.10.2016
comment
Я использовал это как ссылку: docs.spring. io/spring/docs/current/spring-framework-reference/ - person alexbt; 24.10.2016
comment
В моем случае отсутствие добавления аргументов в определение pointcut приводит к следующему исключению: ошибка в::0 формальная несвязанная в pointcut в org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319) ~[aspectjweaver -1.9.4.jar:na] - person carlos palma; 28.09.2020