2.11. CDI の統合

RESTEasy と CDI の統合は、resteasy-cdi モジュールにより提供されます。

JAX-RS および CDI 仕様の両方が、独自のコンポーネントモデルを導入します。一連の基本制約を満たす CDI アーカイブに含まれるすべてのクラスは、暗黙的に CDI Bean です。JAX-RS コンポーネントになるようにするには、@Path or @Provider を使用して Java クラスを明示的に宣言する必要があります。統合コードがない場合、JAX-RS アノテーションを持つ CDI bean に適したクラスにアノテーションを付けると、誤った結果が出され、JAX-RS コンポーネントは CDI によって管理されません。resteasy-cdi モジュールは、RESTEasy が CDI コンテナーから取得したクラスインスタンスと連携できるようにするブリッジです。

Web サービスの呼び出し中に、resteasy-cdi モジュールは JAX-RS コンポーネントの管理対象インスタンスに対して CDI コンテナーを要求します。次に、このインスタンスが RESTEasy に渡されます。Bean デプロイメントアーカイブではない JAR ファイルに置かれているクラスなど、何らかの理由で管理インスタンスが利用できない場合、RESTEasy はクラス自体をインスタンス化するためにフォールバックします。

これにより、インジェクション、ライフサイクル管理、イベント、デコレーション、インターセプターバインディングなどの CDI サービスを JAX-RS コンポーネントで使用できます。

2.11.1. デフォルトのスコープ。

スコープを明示的に定義しない CDI bean はデフォルトで @Dependent スコープが設定されます。この擬似スコープは、Bean がインジェクトされる Bean のライフサイクルに適応することを意味します。リクエスト、セッション、アプリケーションなどの通常のスコープは、コンポーネントのライフサイクル境界を明示的に指定するため、JAX-RS コンポーネントにより適しています。そのため、resteasy-cdi モジュールは以下の方法でデフォルトのスコーピングを変更します。

  • JAX-RS root リソースがスコープを明示的に定義しない場合は、リクエストスコープにバインドされます。
  • JAX-RS プロバイダーまたは javax.ws.rs.Application サブクラスがスコープを明示的に定義しない場合は、アプリケーションスコープにバインドされます。
警告

スコープを宣言しないすべての bean のスコープは resteasy-cdi モジュールによって変更されるため、セッション bean にも影響を及ぼします。これにより、仕様によりこれらのコンポーネントが @RequestScoped になることが禁止されるため、ステートレスセッション Bean またはシングルトンの範囲が自動的に変更されると競合が発生します。そのため、ステートレスセッション Bean またはシングルトンを使用する場合は、スコープを明示的に定義する必要があります。この要件は、今後のリリースで削除される可能性があります。

resteasy-cdi モジュールは JBoss EAP にバンドルされています。したがって、モジュールを個別にダウンロードしたり、設定を追加したりする必要はありません。JAX-RS リソースで CDI bean を使用する作業例は、JBoss EAP に同梱される kitchensink クイックスタートを参照してください。