23.4. RESTEasy を使用した RESTful HTTP Web サービス
Seam は JAX-RS 仕様 (JSR 311) の RESTEasy 実装を統合します。ご使用の Seam アプリケーションに統合する機能を以下から決定することができます。
- RESTEasy ブートストラップと設定、リソースの自動削除、およびプロバイダ
- SeamResourceServlet による HTTP/REST 要求、
web.xmlでの外部のサーブレットおよび設定の必要性はなし - Seam コンポーネントとしてのリソースの記述、Seam の完全なライフサイクルの管理とバイジェクション
23.4.1. RESTEasy 設定と要求 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
まず、RESTEasy ライブラリと
jaxrs-api.jar をダウンロードします。それらを統合ライブラリ (jboss-seam-resteasy.jar) やご使用のアプリケーションに必要な他のライブラリとともにデプロイします。
seam-gen ベースのプロジェクトでは、これは、
jaxrs-api.jar、resteasy-jaxrs.jar、および jboss-seam-resteasy.jar を deployed-jars.list (war デプロイメント) または deployed-jars-ear.list (ear デプロイメント) ファイルに追加することによって行えます。JBDS ベースのプロジェクトの場合は、上記のライブラリを EarContent/lib (ear デプロイメント) または WebContent/WEB-INF/lib (war デプロイメント) フォルダにコピーし、IDE でプロジェクトをリロードします。
@javax.ws.rs.Path でアノテーション付与されたすべてのクラスは、起動時に自動的に発見され HTTP リソースとして登録されます。Seam は 組み込みSeamResourceServlet を使って自動的に HTTP 要求を受け入れ、提供します。リソースの URI は以下のように構築されます。
- URI は例として
/seam/resourceのSeamResourceServletのweb.xmlでマップされたパターンで始まります。この設定を変更して、異なるベースでご使用の RESTful リソースを公開します。これは グローバルな 変更で、他の Seam リソース (s:graphicImage) もこのベースパスで提供されます。 - Seam の RESTEasy 統合ではベースパスに設定可能な文字列を追加します (デフォルトは
/rest)。このため、サンプルではリソースの完全なベースパスは/seam/resource/restとなるでしょう。今後の REST API のアップグレードに備えてバージョン番号を追加するなど、ご使用のアプリケーションのこの文字列をさらに記述的なものに変更することをお薦めします。これにより旧のクライアントは旧の URI ベースを維持することができます。 - 最後に、リソースは定義された
@Pathで使用可能です。たとえば、@Path("/customer")でマップされたリソースは、/seam/resource/rest/customerで使用可能となります。
次のリソースの定義は、URI
http://your.hostname/seam/resource/rest/customer/123 を使用した GET 要求に対するプレーンテキスト表現を返します。
これらのデフォルトで望ましい場合は、追加で設定する必要はありません。ただし、必要ならばご使用の Seam アプリケーションで RESTEasy を設定することが可能です。まず、
resteasy 名前空間を XML 設定ファイルのヘッダーにインポートします。
<resteasy:application resource-path-prefix="/restv1"/>
<resteasy:application resource-path-prefix="/restv1"/>
リソースへの完全なベースパスは
/seam/resource/restv1/{resource} です。@Path の定義とマッピングは変わらない点に注意してください。これはアプリケーション全体に及ぶスイッチであり、通常は HTTP API のバージョニングに使用されます。
リソースに完全なパスをマップしたい場合は、ベースパスのストリッピングを無効にできます。
<resteasy:application strip-seam-resource-path="false"/>
<resteasy:application strip-seam-resource-path="false"/>
ここでリソースのパスが
@Path("/seam/resource/rest/customer") にマップされました。この機能を無効にすることで、リソースクラスのマッピングを特定のデプロイメントシナリオにバインドします。これは 推奨されません。
Seam はクラスパスをすべてのデプロイされた
@javax.ws.rs.Path リソースまたは @javax.ws.rs.ext.Provider クラスにスキャンします。以下のようにスキャンを無効にして、これらのクラスを手動で設定することが可能です。
use-built-in-providers のスイッチは RESTEasy 組み込みプロバイダを有効 (デフォルト) または無効にします。これらはプレーンテキスト、JSON および JAXB マーシャリングを提供するため、有効にしておくことが推奨されます。
RESTEasy はリソースとして純粋な EJB (Seam コンポーネントでない EJB) に対応します。
web.xml で移植可能でない方法で JNDI の名前を設定する代わりに (RESTEasy のドキュメントを参照)、上記に示したとおり components.xml でビジネスインターフェースではなく、単純に EJB 実装クラスを一覧にすることができます。EJB の @Local インターフェースに Bean 実装クラスではなく @Path、@GET などでアノテーションを付与する必要がある点に注意してください。これによりご使用のアプリケーションをグローバルな Seam jndi-pattern のスイッチをオン <core:init/> にした状態で、デプロイメントで移植可能に保つことができます。純粋な (Seam コンポーネントでない) EJB リソースはリソースのスキャンが有効であっても見つからず、常に手動で一覧化する必要がある点に注意してください。繰り返しになりますが、このパラグラフ全体は Seam コンポーネントでなく、かつ @Name アノテーションを持っていない EJB リソースに関連しているだけです。
最後に、メディアタイプと言語 URI 拡張子を設定できます。
この定義は
.txt.deutsch の URI サフィックスを追加の Accept、Accept-Language ヘッダーの値、text/plain、de-DE にマップします。