2011-02-16 40 views
1

我正在寫一些建議,我希望交易在獲得建議前進行提交。它似乎適用於保存和刪除,但是當我更新時,它會運行徹底的建議,然後拋出異常。春季AOP訂購 - 建議之前的交易

try { 
    retVal = pjp.proceed(); 
} catch (Exception e) { 
    PSPSFaultException fault = new PSPSFaultException(e); 
    pmLog.error(ERR_MSG, fault); 
    throw fault; 
} 

正如你在這裏看到的,我試圖在我們自己的運行時異常中包裝異常。

我想訂購:

<tx:annotation-driven transaction-manager="txManager" order="1"/> 

@Around("execution(* blah.blah.PersistenceProvider.*(..))") 
@Order(value=2) 
public Object persistenceWrapper(ProceedingJoinPoint pjp) throws Throwable { 

但這似乎並沒有把堆棧或功能的任何差異。

@Transactional(propagation = Propagation.REQUIRED) 
public class PersistenceProviderImpl extends HibernateDaoSupport implements PersistenceProvider { 

@Override 
public void update(Object o) { 
    this.getHibernateTemplate().update(o); 
} 

有沒有一種方法可以在建議之前讓更新激發?該交易是在DAO水平...

+0

具體來說,我的測試更新的東西是不是在數據庫上。我得到一個HibernateOptimisticLockingFailureException錯誤... – markthegrea 2011-02-16 21:30:36

回答

7

好了,你做錯了兩兩件事:

  1. 你應該有你附近的意見smaler價值和更大的價值近 您的事務管理器(高優先級建議,執行 第一 - 低優先級的事務管理器,稍後執行)
  2. 你要跟應該把@Order(1)註釋全部@Aspect類(怪的面前,但它爲我的作品)

類似這樣的:

... 
<tx:annotation-driven transaction-manager="txManager" order="200"/> 
... 
@Order(1) 
@Aspect 
public class MyAspect { 
... 
+1

只是澄清,從[春季文檔](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html# aop-ataspectj-advice-ordering)_給出兩個方面,從```Ordered.getValue()```(或註解值)返回較低值的方面具有較高的優先級。' – opyate 2013-02-09 09:53:16

+0

這在「 `有序```接口也是:``int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;``` – opyate 2013-02-09 10:54:39

1

在我的情況下,上述建議是行不通的。我使用編譯時與Maven編織,所以這可能是原因。

我的目標是在事務完成後處理數據庫異常並將它們包裝到另一個異常中。

我不得不在上述方面的文件(我猜哪一個無所謂)之一,包括:

@DeclarePrecedence(value = "*..*TransactionException*,  org.springframework.transaction.aspectj.AbstractTransactionAspect, *..*Logging*, *")