这是有问题的代码。
@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()