環境: Java EE 6
呼び出された Bean がコンテナー管理 (CMT) であるか、Bean 管理 (BMT) であるかを Interceptor で判別する方法は?
環境: Java EE 6
呼び出された Bean がコンテナー管理 (CMT) であるか、Bean 管理 (BMT) であるかを Interceptor で判別する方法は?
Beanは、定義上、常にコンテナで管理されます。
知りたいのは、現在のトランザクションCMTまたはBMTである可能性があります。@AroundInvokeインターセプターメソッドはインターセプトされたビジネスメソッドと同じトランザクションで実行されるため、次の方法でトランザクションタイプを確認できます。
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;
}
}
}
もちろん、例外を使用してフローを制御することは悪いことですが、BMTとCMTを区別するための代替方法を私は知りません。
間違ったレベルで問題を解決しているようです。いずれにせよ、テストのようなisCMT()
ものはあまりオブジェクト指向ではありません。1 つは BMT の Bean 用、もう 1 つは CMT 用の 2 つのインターセプターを用意しないのはなぜですか? 適切な Bean には適切なインターセプターを使用してください... 2 つのインターセプターは、必要に応じて共通の親クラスを継承することにより、共通のロジックを再利用できます。
インターセプターが呼び出された対象InvocationContext
を取得するためClass
に使用できます。Method
次に、それらのアノテーションを解析して、トランザクション管理タイプを決定できます。しかし、このアプローチには大きな欠点が 1 つあります。デプロイメント記述子を使用してトランザクション管理プロパティが設定された場合ejb-jar.xml
、アノテーションがまったくないか、オーバーライドされた無効なアノテーションが見つかる可能性があります。java.util.Map<java.lang.String,java.lang.Object> getContextData()
また、結果を呼び出して発見することもできます。