23.4.5. RESTful API によるエンティティの公開
Seam により RESTful の方法を使用して、アプリケーションデータにアクセスすることは実に簡単です。Seam が導入した改善点のひとつとして、純粋な HTTP 呼び出しによるリモートアクセスに対し SQL データーベースの一部を公開することができることです。このため、Seam/RESTEasy 統合モジュールは 2 つのコンポーネント
ResourceHome と ResourceQueryを提供します。これは Seam Application Framework (13章Seam アプリケーションフレームワーク) により提供された API から利点を受けています。これらのコンポーネントにより、ドメインモデルエンティティクラスを HTTP API にバインドすることができます。
23.4.5.1. ResourceQuery リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ResourceQuery は RESTful Web サービスのような機能をクエリするエンティティを公開します。デフォルトでは、基礎となるシンプルな Query コンポーネントは、任意のエンティティクラスのインスタンスの一覧を返し、自動的に作成されます。もしくは、ResourceQuery コンポーネントはより高度なクラスの既存の Query コンポーネントにリンクすることができます。次のサンプルではどれほど簡単に ResourceQuery を設定できるか示しています。
<resteasy:resource-query path="/user" name="userResourceQuery" entity-class="com.example.User"/>
<resteasy:resource-query
path="/user"
name="userResourceQuery"
entity-class="com.example.User"/>
この単一の XML エレメントにより、ResourceQuery コンポーネントが設定されます。設定は簡単です。
- コンポーネントは
com.example.Userインスタンスの一覧を返します。 - コンポーネントは URI パス
/userの HTTP 要求を処理します。 - コンポーネントはデフォルトではデータを (クライアントの好みに基づき) XML または JSON に変換します。対応する MIME タイプのセットは
media-types属性を使用して変更できます。例えば以下のとおりです。
<resteasy:resource-query path="/user" name="userResourceQuery" entity-class="com.example.User" media-types="application/fastinfoset"/>
<resteasy:resource-query
path="/user"
name="userResourceQuery"
entity-class="com.example.User"
media-types="application/fastinfoset"/>
XML を使用してコンポーネントを設定するのを好まない場合は、別の方法として拡張機能によってコンポーネントを設定できます。
@Name("userResourceQuery")
@Path("user")
public class UserResourceQuery extends ResourceQuery<User>
{
}
@Name("userResourceQuery")
@Path("user")
public class UserResourceQuery extends ResourceQuery<User>
{
}
Query は読み取り専用の動作で、リソースは GET 要求にのみ応答します。さらに Web サービスのクライアントは、ResourceQuery を使用することで次のパスパラメータを使ってクエリの結果のセットを操作できます。
| パラメータの名前 | 例 | 詳細 |
|---|---|---|
| start | /user?start=20 | 20 番目のエントリで始まるデーターベースクエリの結果のサブセットを返します。 |
| show | /user?show=10 | 10 エントリに制限されたデーターベースクエリの結果のサブセットを返します。 |
例えば、HTTP GET 要求を
/user?start=30&show=10 に送り、行 30 で始まる 10 行を表すエントリの一覧を取得します。
注記
RESTEasyは JAXB を使用してエンティティをマーシャルします。よって、それらをワイヤで転送するには、
@XMLRootElement でエンティティクラスにアノテーションを付与する必要があります。詳細は JAXB および RESTEasy のドキュメントを参照してください。