2016-08-29 64 views
0

我的設置:抓EJBTransactionRolledbackException之前被記錄到文件

我有一個EJB豆(部署在耳朵上一個JBoss 6.4)與計算數據庫中的一些值,並將其存儲的方法。該方法在新事務中啓動。它看起來像這樣:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void doStuff() { 
    MyObject value = calculateSomeValues(); 

    entityManager.merge(value); 
    entitiyManager.flush(); 
} 

在設計上,它有可能刷新失敗因ConstraintViolationException。由於這是一項新的交易,因此該例外將被包裹在EJBTransactionRolledbackException中,並作爲RuntimeException拋出。我已經爲ejb異常設置了日誌記錄,因爲在整個系統中找到它們非常有用。然而,據我所知,ConstraintViolationException會不時發生,我想趕上它,並在日誌記錄系統將其記錄爲錯誤之前回滾(違反約束條件不會被視爲異常,但它需要從數據庫的角度視圖)。此刻,我的日誌文件被堵塞的條目像這樣的:

ERROR [org.jboss.as.ejb3.invocation] (default-threads - 49) JBAS014134: EJB Invocation failed on component 

我如何能趕上該記錄器從印刷這些錯誤防止這樣的例外? (注意:我仍然希望它記錄所有其他EJBTransactionRolledbackException s)

回答

1

我沒有部署JBoss 6,所以我無法立即測試是否有精確的異常類型也適用於JBoss 6(我在WildFly 8上試過) 。

一個可行的辦法是把你的EJB由@AroundInvoke註釋(至少如果你沒有這個EJB其它攔截器)的方法:

@AroundInvoke 
    public Object myConstraintViolationInterceptor(InvocationContext ctx) throws Exception 
    { 
     try { 
      return ctx.proceed(); 
     } 
     catch(PersistenceException e) { 
      if (e.getCause() instanceof org.hibernate.exception.ConstraintViolationException) { 
       //some action taken 
      } 
      else { 
       throw e; 
      } 
      return null; 
     } 
    } 

順便說一句,如果你的ConstraintViolationException是實際上是樂觀的鎖定異常(也就是說,由於另一用戶在此期間修改了一些數據而引發了異常),也許最好將其報告給用戶。

+0

超級!這工作!最終我創建了自己的'UserTransaction',這樣我就可以自己處理特定的案例,但這只是您描述的另一種方式。 – Pphoenix