Попытка заставить AspectJ Pointcut попасть в аннотацию Transactional И ввести переменные

Это код, о котором идет речь.

@Aspect
@EnableAspectJAutoProxy
public class TransactionAspect extends TransactionSynchronizationAdapter {
   public TransactionMonitor transactionMonitor;    
   String message;

 @Before("execution(@org.springframework.transaction.annotation.Transactional * *.*(..)) && args(message,..))")
public void registerTransactionSynchronization(String message) {
    TransactionSynchronizationManager.registerSynchronization(this);
    this.message = message;
}

    public void setTransactionMonitor(TransactionMonitor transactionMonitor) {
    this.transactionMonitor = transactionMonitor;
}

Я создал этот компонент Aspect в своем файле конфигурации spring.

Изначально у меня это было в блоке @Before @Before("@annotation(org.springframework.transaction.annotation.Transactional)")

Это сработало. Места, где у меня есть аннотация Transactional, будут называть это Pointcut. Однако мне также нужны переменные из метода, который я использую для этого аспекта. Вот где приходит args(message). Я пробовал несколько разных способов получить это сообщение (которое является строкой), но безрезультатно.

Кто-нибудь знает, как я могу создать этот Pointcut, чтобы он попадал в аннотацию Transactional, а также извлекать переменную из метода, который я аннотировал с помощью Transactional? Спасибо любезно.


person El Duderino    schedule 09.06.2017    source источник


Ответы (1)


Вы можете попробовать использовать JoinPoint для получения его аргументов[1]:

@Before("@annotation(annotation)")
public void registerTransactionSynchronization(final JoinPoint jp, final Transactional annotation) {

    // These are the method parameters, yours would be at parameters[0], but check first... ;)
    final Object[] parameters = jp.getArgs(); 

    // Your stuff here       
}

Использование «args (message,...)» в определении JP, вероятно, также работает, но IIRC первым параметром должен быть сам JoinPoint. Так что может быть достаточно просто добавить это в сигнатуру метода.

[1] http://www.eclipse.org/aspectj/doc/released/runtime-api/org/aspectj/lang/JoinPoint.html#getArgs()

person sheltem    schedule 13.06.2017