2017-06-09 19 views
0

这是有问题的代码。试图让AspectJ切入点击中事务性注释并引入变量

@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配置文件中创建这方面的bean。

我本来该在@Before阻止 @Before( “@注释(org.springframework.transaction.annotation.Transactional)”)

这个工作。我有Transactional注释的地方会调用这个Pointcut。不过,我也需要从我和这方面的方法变量。这就是参数(消息)进来的地方。我尝试了几种不同的方式来检索该消息(这是一个字符串),但无济于事。

难道有人会知道我该如何制作这个Pointcut来实现事务性注释以及从我用Transactional注解的方法中提取一个变量?非常感谢你。

回答

0

您可以尝试使用一个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(消息,...)” 的JP定义可能工作为好,但IIRC第一参数需要是JoinPoint本身。所以将它添加到方法签名中可能就足够了。

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

+0

这工作完美。谢谢! –