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