23.4.2. Seam コンポーネントとしてのリソースとプロバイダ
リソースとプロバイダインスタンスは、デフォルトで RESTEasy により管理されます。リソースクラスは RESTEasy によりインスタンスが作成され単一の要求を提供し、その後破棄されます。これはデフォルトの JAX-RS ライフサイクルです。プロバイダはアプリケーション全体に対し 1 度インスタンスが作成されます。これらはステートレスなシングルトンです。
リソースとプロバイダは Seam コンポーネントとしても記述可能で、Seam のより効果的なライフサイクル管理、バイジェクション、セキュリティの能力の利点を活用できます。以下のようにリソースクラスを Seam のコンポーネントにします。
これで
customerResource インスタンスは、要求がサーバーに到達したときに Seam により処理されます。このコンポーネントはイベントスコープであるため、そのライフサイクルは JAX-RS のライフサイクルとまったく同じです。ただし、Seam JavaBean コンポーネントはインジェクションに完全に対応しており、他のすべてのコンポーネントとコンテキストに完全にアクセスすることができます。セキュリティ、アプリケーション、ステートレスなリソースコンポーネントもまた対応しています。これら 3 つのスコープにより、ステートレスな Seam の中間層の HTTP 要求処理アプリケーションを効果的に作成できます。
インターフェースにアノテーションを付与することで、その実装には JAX-RS アノテーションを付けない状態に保つことが可能です。
SESSION スコープの Seam コンポーネントを使用できます。ただしデフォルトでは、セッションは短くなり単一の要求となります。言い換えると HTTP 要求が RESTEasy 統合コードにより処理されている場合、HTTP セッションが作成されるため Seam コンポーネントはそのコンテキストを活用できます。要求が処理されたら、Seam はセッションを調べて、セッションがその単一の要求を提供するためだけに作成されたかを決定します (要求を持つセッション識別子はありません。要求のために存在したセッションもありません)。セッションがこの要求のためだけに作成された場合は、このセッションは要求後に破棄されます。
Seam アプリケーションがイベント、アプリケーション、またはステートレスなコンポーネントのみを使用すると仮定しましょう。この手順はサーバー上の使用可能な HTTP セッションの消費を防ぎます。Seam と RESTEasy の統合は、デフォルト設定でセッションが使用されないと仮定しています。したがって、各 REST 要求がタイムアウトしたときのみ削除されるセッションを開始するため、貧弱なセッションは増加します。
RESTful Seam アプリケーションがセッション状態を REST HTTP 要求全体に渡って保存する必要がある場合は、設定ファイルでこの動作を無効にします。
<resteasy:application destroy-session-after-request="false"/>
<resteasy:application destroy-session-after-request="false"/>
これで各 REST HTTP 要求は
Session.instance().invalidate() によりコード内でタイムアウトまたは明示的な無効化によってのみ削除される新しいセッションを作成します。要求全体に渡りセッションコンテキストを活用したい場合は、HTTP 要求とともに有効なセッション識別子を渡すことはご自身の責任となります。
対話スコープのリソースコンポーネントと対話マッピングは現在サポートされていませんが、Seam の今後のバージョンではサポートされる予定です。
プロバイダクラスは Seam コンポーネントとなることも可能です。アプリケーションによるスコープかステートレスのどちらかでなければなりません。
リソースとプロバイダは他の Seam コンポーネントのように、EJB または JavaBean となることが可能です。
EJB Seam コンポーネントは REST リソースとしてサポートされています。EJB 実装クラスではなく必ずローカルビジネスインターフェースに JAX-RS でアノテーションを付与するようにします。EJB は
STATELESS である必要があります。
注記
RESTEasy コンポーネントはホットデプロイメントをサポートしません。したがって、これらのコンポーネントを
src/hot フォルダーに置かないでください。代わりに src/main フォルダーを使用してください。
注記
3.4.1 項の JAX RS 仕様で定義されたサブリソースは、この時点では Seam コンポーネントインスタンスとなることはできません。ルートリソースクラスのみが Seam コンポーネントとして登録可能です。言い換えると、ルートリソースメソッドから Seam コンポーネントインスタンスを返さないようにしてください。