2012-08-14 57 views
1

環境:Java EE 6的確定BMT或CMT

如何攔截確定調用bean是容器管理(CMT)或Bean管理(BMT)?

回答

2

豆類定義始終容器管理。

可能你想知道的是當前事務CMT或BMT。用異常來控制流量不好

public class SomeInterceptor { 
    @Resource 
    private javax.ejb.SessionContext sessionContext; 

    @AroundInvoke 
    public Object intercept(InvocationContext ctx) throws Exception { 
     if (isCMT()) { 

     } 
     ... 
    } 

    private boolean isCMT() { 
     try { 
      //throws IllegalStateException if not BMT 
      sessionContext.getUserTransaction(); 
      return false; 
     } 
     catch (IllegalStateException ise) { 
      return true; 
     } 
    } 
} 

當然,但我不知道其他方法來區分的:由於@AroundInvoke攔截方法是在相同的事務中截獲業務方法執行,你可以用以下命令來檢查交易類型BMT和CMT。

+0

不錯的主意,但似乎依靠異常尷尬。 – anergy 2012-08-14 09:58:53

+0

這是,但可能沒有其他的選擇。 – 2012-08-14 09:59:48

+0

這是有趣的黑客:) – gkuzmin 2012-08-14 10:01:00

0

您可以使用InvocationContext獲取調用攔截器的ClassMethod。然後,您可以嘗試爲它們解析註釋並確定事務管理類型。但是這種方法有一個巨大的缺點:如果使用ejb-jar.xml部署描述符設置事務管理屬性,那麼您可以根本找不到註釋或無效的重寫註釋。您也可以嘗試調用java.util.Map<java.lang.String,java.lang.Object> getContextData()並發現結果。

0

這似乎是在錯誤的層面解決問題。如果像isCMT()這樣的測試無論如何都不是非常面向對象的。爲什麼不用兩個攔截器,一個用於BMT的豆子,另一個用於CMT?爲正確的bean使用正確的攔截器......如有必要,兩個攔截器仍然可以通過繼承一個共同的父類來重用公共邏輯。

+0

謝謝,但重點是讓它不可知論的BMT或CMT – anergy 2012-08-14 12:52:31