2014-07-09 30 views
1

我的@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的事務不工作:

回答

2

通過對類似問題的其他幾個帖子去了用AspectJ代替Spring AOP的調用Bean類方法 OR 如果你不想使用AspectJ和堅持的Spring AOP那麼類的簡單refatoring將解決如下問題:

在問題方法public方法addCartItem和實際的實現方法(whic h實際上有實現代碼)都在同一個bean類中。 考慮創建一個委託類作爲此Bean類上方的圖層,並將公共方法addCartItem放入該類中。然後將這兩個私有方法設爲public,並嘗試從委託方法調用bean類方法。

相關問題