8

認証モジュールとして機能するステートフルセッションBean(SFSB)があります。SFSBには、ログインしている現在のユーザーを格納します。さらに、エンティティのJPA / SQLを処理するファサード(ステートレスセッションBean(SLSB))がいくつかあります。現在のユーザーのアクセス許可を確認するために、SLSBからSFSBを呼び出そうとします。ただし、SLSBから呼び出された場合、現在のユーザーフィールドは常に「null」です。SFSBを直接呼び出す場合、現在のユーザーフィールドが正しく設定されています...呼び出しには、@EJBアノテーションを使用します。

問題が何であるかについて何か考えはありますか?それはどういうわけか文脈の問題ですか?SLSBからSFSBを呼び出して、その状態を維持することは一般的に可能ですか?

よろしくお願いします!

4

3 に答える 3

9

ステートレスセッションBeanからステートフルセッションBeanを呼び出さないでください。

ここにいくつかの読書があります:JEE6チュートリアル-セッションビーンズ

ステートレスBeanはセッションについて何も知りません。あなたがそれを呼ぶときはいつでも、それはステートレスです。次に、ステートフルセッションBeanを呼び出します。ステートレスオブジェクトから呼び出されるため、クライアントのセッションの状態に関連するコンテキストがないのは当然です。

それが機能するかどうかはわかりませんが、@EJB表記を使用してDIの代わりにJNDIルックアップを実行することでコンテキストを取得しようとする可能性があります。ステートレスejbでこのようなものが機能する可能性があります。あなたはおそらくそれで遊ぶ必要があるでしょう、そして私は何も保証することができません。ステートレスejbを呼び出すクライアントのコンテキストを取得する必要があります。クライアントはセッションコンテキスト/スコープを持っているか、それを忘れる必要があります。

@Resource SessionContext sessionContext;

MyStatefulBean msb = (MyStatefulBean)sessionContext.lookup("ejb/MyStatefulBean");
msb.doSomething(fubar);

セッションスコープを持つクライアントまたは別のステートフルejbからステートフルセッションBeanを呼び出すことをお勧めします。ステートレスとステートフルには、存在する理由が異なります。

于 2012-07-11T17:38:21.170 に答える
5

ステートフルEJBをステートレスEJBに挿入しないでください。ステートフルEJBのライフサイクルは、Beanを所有することによって注入および管理されるときに開始されるため、これは非常に予測できない結果をもたらす可能性があります。最悪の場合、ステートレスEJBは、アプリケーションサーバーでさまざまなユーザーに再利用でき、アプリケーションサーバーは同じステートフルEJBにアクセスします。あなたの場合、ユーザーは別のユーザーとして識別されます。

ほとんどの場合、ステートフルEJBを現在のHTTPセッションに関連付けたいと考えています。これは、多くの人が想定しているように自動的には行われません。詳細については、EJB 3という名前のセクションをここで読んでください:コンテキストと依存性注入の記事

ステートフルEJBをセッションに関連付けるには、ステートフルEJBをセッションスコープのCDI Beanに挿入する必要があります。これは、ステートレスBeanに自由に挿入できます。実際には、スタブとセッションスコープのBeanのみが挿入されます(ステートフルEJBと一緒に)。新しいセッションごとに作成されます。

おそらくさらに良いアプローチは、ステートフルBeanのインターフェースを抽出し、CDIプロデューサーを使用してsatefulBeanのセッションスコープの実装を作成することです。このようにして、EJBの例外でステートフルEJBが自動的に削除される場合も処理できます。このような場合、同じセッション内でEJBを再作成することをお勧めします。

于 2014-09-15T20:16:36.600 に答える
0

ステートフルBeanの中にステートフルセッションBeanを注入した場合、ルックアップによっても機能しません。これは、ステートフルBeanに対して新しいインスタンスが作成されるため、ログに記録されたユーザー情報などの値が保持されないためです。

于 2013-06-07T03:03:12.440 に答える