5

アプリケーション クライアントからステートフル セッション Bean (SFSB) にアクセスできません。JBoss 5.0.1.GA を使用しています。アプリケーション クライアントと EJB は両方ともデプロイする EAR にパッケージ化されており、問題なく動作する他のアプリケーション クライアントがあります。これまで、私はステートレス セッション Bean (SLSB) しか使用していませんでしたが、私が理解している限り、SLSB と SFSB の違いは、アプリケーション クライアントからのアクセス方法には影響しません。

クラス/インターフェースの構造:

@Local public interface A {...}

@Stateless public class ABean implements A {...}

@Remote public interface B {...}

@Stateful public class BBean implements B {
    @EJB private A anInstanceOfA;

    @PostConstruct private void init() {
        this.anInstanceOfA.someMethod();
    }
}

アプリケーション クライアントは、「 JBoss 5 でアプリケーション クライアントを使用する方法」で説明されているように、「appclient-launcher」を介して実行されます。init() の実行中に (ローカル) ABean で someMethod() が呼び出されるまで、「BBean」のルックアップを行うことは正常に機能します。その呼び出し中に、コンテナーは InvalidStateException("Local call: security context is null") をスローします (根本的な原因として)。ステートフル Bean をステートレス Bean に変更すると、すべて正常に動作します (もちろん、状態が保持されないことを除きます)。興味深いことに、Web アプリケーション (JSF マネージド Bean) からまったく同じ SFSB を問題なく使用できます。

私は何か間違ったことをしていますか?アプリケーション クライアントから SFSB を使用するにはどうすればよいですか?

これまでのところ、この特定の問題について役立つものは何も見つかりませんでした。この例外は、[#JBAS-4317] Security Context over the invocationの同様のコンテキストで言及されていますが、完了としてマークされ、JBoss 5.0.0.Beta3 で修正されていることを考慮すると、同じ問題ではないようです。

4

2 に答える 2

1

元のセットアップがステートレス セッション Bean では完全に機能し、ステートフル セッション Bean では機能しない理由を知りたいのですが、ここに私が見つけた解決策があります。

EAR にもパッケージ化されている Web アプリケーションは、JAAS を介して認証を行います。このために、JBoss login-config.xml でセキュリティ ドメインを設定しました。これは次のようになります。

<application-policy name="My-SD">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="unauthenticatedIdentity">guest</module-option>
            <module-option name="dsJndiName">java:/myDS</module-option>
            <module-option name="principalsQuery">SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0</module-option>
            <module-option name="rolesQuery">SELECT ROLE, 'Roles' FROM USER_ROLE WHERE LOGIN = ?</module-option>
        </login-module>
    </authentication>
</application-policy>

このセキュリティ ドメインを Web アプリケーションの jboss-web.xml と EJB プロジェクトの jboss.xml で使用しましたが、実際には Web アプリケーションでしか使用していません (EJB は認証なしでアクセスできます)。

SFSB へのアクセスに関する問題を解決するには、EJB プロジェクトの jboss.xml からセキュリティ ドメインを削除する必要がありました。これにより、JBoss はデフォルトのセキュリティ ドメインを使用するようになり、これは正しいことを行うように見え、アプリケーション クライアントは最終的に SFSB にアクセスして使用できるようになります。

于 2009-05-14T09:47:41.763 に答える
0

その理由は、EJB 3.0 Core Specificationのセクション 12.4 にあります。そこに書かれている

ライフサイクル コールバック インターセプタ メソッドは、未指定のトランザクションおよびセキュリティ コンテキストで呼び出されます。

hth、
-マーティン

于 2012-07-19T13:28:35.193 に答える