23.4.2. Seam コンポーネントとしてのリソースとプロバイダ


リソースとプロバイダインスタンスは、デフォルトで RESTEasy により管理されます。リソースクラスは RESTEasy によりインスタンスが作成され単一の要求を提供し、その後破棄されます。これはデフォルトの JAX-RS ライフサイクルです。プロバイダはアプリケーション全体に対し 1 度インスタンスが作成されます。これらはステートレスなシングルトンです。
リソースとプロバイダは Seam コンポーネントとしても記述可能で、Seam のより効果的なライフサイクル管理、バイジェクション、セキュリティの能力の利点を活用できます。以下のようにリソースクラスを Seam のコンポーネントにします。
@Name("customerResource")
@Path("/customer")
public class MyCustomerResource {

    @In
    CustomerDAO customerDAO;

    @GET
    @Path("/{customerId}")
    @Produces("text/plain")
    public String getCustomer(@PathParam("customerId") int id) {
         return customerDAO.find(id).getName();
    }

}
Copy to Clipboard Toggle word wrap
これで customerResource インスタンスは、要求がサーバーに到達したときに Seam により処理されます。このコンポーネントはイベントスコープであるため、そのライフサイクルは JAX-RS のライフサイクルとまったく同じです。ただし、Seam JavaBean コンポーネントはインジェクションに完全に対応しており、他のすべてのコンポーネントとコンテキストに完全にアクセスすることができます。セキュリティ、アプリケーション、ステートレスなリソースコンポーネントもまた対応しています。これら 3 つのスコープにより、ステートレスな Seam の中間層の HTTP 要求処理アプリケーションを効果的に作成できます。
インターフェースにアノテーションを付与することで、その実装には JAX-RS アノテーションを付けない状態に保つことが可能です。
@Path("/customer")
public interface MyCustomerResource {

    @GET
    @Path("/{customerId}")
    @Produces("text/plain")
    public String getCustomer(@PathParam("customerId") int id);

}
Copy to Clipboard Toggle word wrap
@Name("customerResource")
@Scope(ScopeType.STATELESS)
public class MyCustomerResourceBean implements MyCustomerResource {

    @In
    CustomerDAO customerDAO;

    public String getCustomer(int id) {
         return customerDAO.find(id).getName();
    }

}
Copy to Clipboard Toggle word wrap
SESSION スコープの Seam コンポーネントを使用できます。ただしデフォルトでは、セッションは短くなり単一の要求となります。言い換えると HTTP 要求が RESTEasy 統合コードにより処理されている場合、HTTP セッションが作成されるため Seam コンポーネントはそのコンテキストを活用できます。要求が処理されたら、Seam はセッションを調べて、セッションがその単一の要求を提供するためだけに作成されたかを決定します (要求を持つセッション識別子はありません。要求のために存在したセッションもありません)。セッションがこの要求のためだけに作成された場合は、このセッションは要求後に破棄されます。
Seam アプリケーションがイベント、アプリケーション、またはステートレスなコンポーネントのみを使用すると仮定しましょう。この手順はサーバー上の使用可能な HTTP セッションの消費を防ぎます。Seam と RESTEasy の統合は、デフォルト設定でセッションが使用されないと仮定しています。したがって、各 REST 要求がタイムアウトしたときのみ削除されるセッションを開始するため、貧弱なセッションは増加します。
RESTful Seam アプリケーションがセッション状態を REST HTTP 要求全体に渡って保存する必要がある場合は、設定ファイルでこの動作を無効にします。
<resteasy:application destroy-session-after-request="false"/>
Copy to Clipboard Toggle word wrap
これで各 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 コンポーネントインスタンスを返さないようにしてください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat