我的@Transaction
啓用類中有一個方法,該類使用java反射從外部類中調用。不幸的是,Spring Transaction不適用於這種方法。 類看起來像下面:Spring AOP事務註釋無法在使用java反射調用的方法上工作
@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()
調用1。
問題是,當發生RuntimeException時,事務仍然被提交,這實際上意味着Spring Transaction不能在我的私有方法中工作。 驚喜地下面的語句,如果我把它放在我的私有方法內返回true:
TransactionSynchronizationManager.isActualTransactionActive()
我的應用程序正在使用整個Spring AOP的交易,它無縫工作。應用-config.xml文件片斷如下:
<context:annotation-config />
<context:component-scan base-package="com.apraxalpha.dealernews" />
<tx:annotation-driven />
我已閱讀本blog這表明使用基於AspectJ事務在Spring AOP的交易方式。我對此沒有真正的信心,因爲我的整個應用程序都使用基於Spring AOP的事務。現在只需要1次實現更改,我不想將所有事情都改爲AspectJ事務。 1)有沒有這樣的中間路徑在我的應用程序中都有這兩種方法? 2)有沒有其他方法讓我的私有方法中的事務使用java反射來調用?同時呼籲一個Spring bean類或 2的私有方法)調用從另一種方法一種方法在同一類
好像不是你 1)Spring的事務不工作: