【发布时间】:2014-07-09 13:50:32
【问题描述】:
我的@Transaction 启用类中有一个方法,该方法使用java 反射从外部类调用。不幸的是,Spring Transaction 在此方法中不起作用。
类如下所示:
@Transactional
public class CartServiceImpl implements CartService {
@Autowired
AnnotatedMethodInvoker annotatedMethodInvoker;
@Override
@VersionedParent
public BasicResponse addCartItem(AddCartItemRequest addCartItemRequest) throws Exception{
String currentMethodName = Thread.currentThread().getStackTrace()[1].getMethodName();
return (BasicResponse)annotatedMethodInvoker.invoke(this, currentMethodName, addCartItemRequest, AddCartItemRequest.class);
}
@VersionedMethod(parentMethod="addCartItem", minimumVersion=Constants.BUILD_VERSION_1_0_1, description="Added Epoch")
private BasicResponse addCartItemWithEpoch(AddCartItemRequest addCartItemRequest){
/***** Implementation detail goes here *****/
}
@VersionedMethod(parentMethod="addCartItem", minimumVersion=Constants.BUILD_VERSION_1_0_2, description="Added Cart filter here")
private BasicResponse addCartItemWithCartFilter(AddCartItemRequest addCartItemRequest){
/***** Implementation detail goes here *****/
}
}
在AnnotatedMethodInvoker 类的invoke() 方法中,我调用了两个private 方法中的一个addCartItemWithEpoch() 和addCartItemWithCartFilter()。
问题在于,当发生 RuntimeException 时,事务仍在提交,这实质上意味着 Spring Transaction 在我的私有方法中不起作用。 令人惊讶的是,如果我把它放在我的私有方法中,下面的语句会返回 true:
TransactionSynchronizationManager.isActualTransactionActive()
我的应用程序目前一直在使用 Spring AOP 事务,并且可以无缝运行。 application-config.xml sn -p 下面:
<context:annotation-config />
<context:component-scan base-package="com.apraxalpha.dealernews" />
<tx:annotation-driven />
我已阅读此blog,它建议使用基于 AspectJ 的 Transaction over Spring AOP Transaction 方法。我对此不是很自信,因为我的整个应用程序都在使用基于 Spring AOP 的事务。现在只是为了 1 个单一的实现更改,我不想将所有内容都更改为 AspectJ 事务。 1)在我的应用程序中是否有任何这样的中间路径可以同时使用这两种方法? 2) 有没有其他方法可以让我的私有方法中的 Transaction 使用 java 反射被调用?
【问题讨论】:
标签: reflection aspectj spring-aop spring-transactions