1

環境: Java EE 6

呼び出された Bean がコンテナー管理 (CMT) であるか、Bean 管理 (BMT) であるかを Interceptor で判別する方法は?

4

3 に答える 3

2

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を区別するための代替方法を私は知りません。

于 2012-08-14T09:56:33.497 に答える
0

間違ったレベルで問題を解決しているようです。いずれにせよ、テストのようなisCMT()ものはあまりオブジェクト指向ではありません。1 つは BMT の Bean 用、もう 1 つは CMT 用の 2 つのインターセプターを用意しないのはなぜですか? 適切な Bean には適切なインターセプターを使用してください... 2 つのインターセプターは、必要に応じて共通の親クラスを継承することにより、共通のロジックを再利用できます。

于 2012-08-14T12:40:20.313 に答える
0

インターセプターが呼び出された対象InvocationContextを取得するためClassに使用できます。Method次に、それらのアノテーションを解析して、トランザクション管理タイプを決定できます。しかし、このアプローチには大きな欠点が 1 つあります。デプロイメント記述子を使用してトランザクション管理プロパティが設定された場合ejb-jar.xml、アノテーションがまったくないか、オーバーライドされた無効なアノテーションが見つかる可能性があります。java.util.Map<java.lang.String,java.lang.Object> getContextData()また、結果を呼び出して発見することもできます。

于 2012-08-14T09:42:03.100 に答える