2016-11-10 6 views
0

JAX-RSリソース(@Pathアノテーション付きクラス)には、要求ごとにデフォルトのライフサイクルがあります。JAX_RSリソースとEJBライフサイクルの不一致

EJBは独自のライフサイクルも持っています。つまり、EJBへの参照があると、この参照は実際にはEJBのプールを管理するプロキシオブジェクトの参照です。

EJBがJAX-RSリソースでもある場合、これらのライフサイクルモデルはどのように共存しますか?

https://jersey.java.net/documentation/latest/jaxrs-resources.html

JAX-RSリソースが は、新しいリソースが要求ごとに作成されることを意味し、デフォルトでは、要求ごとのスコープで管理されています。

ソース: https://jersey.java.net/documentation/latest/jaxrs-resources.html

答えて

1

JAX-RSは、Enterprise JavaBeansの技術と連携(エンタープライズBean) とコンテキストと依存性注入のJava EE(CDI)のために。

エンタープライズBeanでJAX-RSを使用するには、 Beanのクラスに@Pathを付けて、リソースクラス に変換する必要があります。 @Pathアノテーションは、ステートレスの セッションBeanとシングルトンPOJO Beanで使用できます。

JAX-RSとCDIのコンポーネントモデルは少し異なります。デフォルトでは、 JAX-RSルートリソースクラスは要求スコープで管理され、スコープの指定には アノテーションは必要ありません。 CDI管理Bean に@RequestScopedまたは@ApplicationScopedアノテーションを付けて、 をJAX-RSリソースクラスに変換できます。

別のBeanクラスを注入するBeanを使用するWebアプリケーションでは、Beanは、ユーザーがアプリケーションとやりとりしている間に状態を保持できる必要があります。この状態を定義する方法は、Beanにスコープ

  • を与えることです@RequestScoped:1つのHTTP要求にWebアプリケーションを持つのユーザの対話を。

  • @SessionScoped:ユーザーが複数のHTTP 要求を介してWebアプリケーションと対話すること。

  • は@ApplicationScoped:共有状態をすべてのユーザーの相互作用の間でのWebアプリケーションで。

  • @Dependent:何も指定されていない場合のデフォルトスコープ。オブジェクト が正確に1つのクライアント(Bean)にサービスを提供し、そのクライアント(Bean)と同じライフサイクル を持つことを意味します。

  • は@ConversationScoped:サーブレットとのユーザのインタラクションを、のJavaServerが アプリケーションに直面含みます。会話スコープは、 の開発者制御境界内に存在し、長時間実行される会話のために複数の 要求にまたがって拡張されます。すべての長時間実行されている の会話は特定のHTTPサーブレットセッションに限定され、 はセッション境界を超えないことがあります。

あなたはコンテキストと別の内部の依存性注入いずれかを実行することができます同じように、あなたの質問に答える、各Beanは独立して自身の状態を管理します。また、実行するロールに応じて、スコープを定義する必要があります。提供してどのようなEJB

https://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm https://docs.oracle.com/javaee/7/tutorial/cdi-basic008.htm#GJBBK

+0

ご質問ありがとうございますが、私はまだ理解していません。 EJBのプールモデルは、JAX-RSリソースのリクエストごとのモデルとどのように互換性がありますか? – GionJh

0

クライアント要求およびトランザクションごとに単一の専用スレッドです。 たとえば、各ステートレスBeanは、要求を処理するのを待機している(注入された)データでインスタンス化されたスレッドインスタンスと考えることができます。 Beanが作成されると、それぞれのメソッド呼び出し(ケースのREST)が再利用または破棄されるためにプールに戻ります。 したがって、RESTの "要求ごとのデフォルトのライフサイクル"とSLSBライフサイクルの間に一致があります。