这是有问题的代码。

@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;
}


我已经在我的spring配置文件中创建了这个Aspect bean。

我最初在@Before块中有这个
@Before(“ @ annotation(org.springframework.transaction.annotation.Transactional)”)

这工作了。我具有“事务性”注释的位置将称为“切入点”。但是,我还需要从我所要使用的方法中获取变量。那就是args(message)传入的地方。我尝试了几种不同的方法来检索该消息(它是一个字符串),但无济于事。

有谁知道我该如何制作此切入点以打上事务性注释,以及从我用事务性注释的方法中提取一个变量?非常感谢你。

最佳答案

您可以尝试使用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
}


在JP定义中使用“ args(message,...)”可能也可以,但IIRC的第一个参数必须是JoinPoint本身。因此,仅将其添加到方法签名中就足够了。

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

10-07 19:50