17.1.7 サブリソースクラス
サブリソースクラスは,リソースメソッド,サブリソースメソッド,またはサブリソースロケータのどれかを一つ以上持ち,クラスレベルでPath アノテーションでアノテートされていないJava のクラスです。
サブリソースクラスの例を次に示します。
package com.sample.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; public class Resource { @Path("/subresourcemethod1") @GET public String subResourceMethod1() { return "from sub resource method1"; } @GET public String resourceMethod() { return "from resource method"; } }
サブリソースクラスのインスタンスは,JAX-RSエンジンによって生成されません。サブリソースクラスは,対応するサブリソースロケータでインスタンス化する必要があります。
- 〈この項の構成〉
(1) メカニズム
サブリソースクラスは,次のように生成され,HTTPリクエストを処理します。
-
HTTPリクエストがサブリソースロケータにディスパッチされます。
-
サブリソースロケータはサブリソースクラスを生成し,HTTPリクエストの処理を生成したサブリソースクラスに委譲します。
-
HTTPリクエストはサブリソースクラスによって直接処理されるか,同じ仕組みによって,さらにサブリソースクラスに委譲されます。
サブリソースロケータについては,「17.1.1(6) サブリソースロケータ」を参照してください。
JAX-RSエンジンは,サブリソースロケータのメソッドシグネチャで宣言された戻り値型ではなく,実行時にサブリソースロケータが返すインスタンスをサブリソースクラスとして扱い,処理を委譲します。
例えば,M,N,およびOの三つのサブリソースクラスがあるとします。NはMを継承し,OはNを継承しています。同様に,戻り型Mを持つRというサブリソースロケータがあるとします。サブリソースロケータがMのインスタンスを返した場合,サブリソースクラスMがHTTPリクエストを実行します。同様に,サブリソースロケータがNのインスタンスを返す場合は,サブリソースクラスNがHTTPリクエストを実行します。Oのインスタンスを返す場合は,サブリソースクラスOがHTTPリクエストを実行します。
(2) ライフサイクル
サブリソースクラスのインスタンスは,JAX-RSエンジンによって生成されません。サブリソースクラスは,対応するサブリソースロケータでインスタンス化する必要があります。このため,サブリソースロケータまたはサブリソースクラスで,コンストラクタのパラメタ,フィールド,およびbeanプロパティを初期化する必要があります。
(3) コンストラクタ
サブリソースクラスのコンストラクタのパラメタでは,JAX-RS仕様のアノテーションを使用しないでください。使用されている場合は無視されます。
(4) フィールドおよびbeanプロパティ
JAX-RS仕様のアノテーションをサブリソースクラスのフィールドおよびbeanプロパティで使用しないでください。使用されている場合は,無視されます。
(5) リソースメソッド,サブリソースメソッド,およびサブリソースロケータ
サブリソースクラスのリソースメソッド,サブリソースメソッド,およびサブリソースメソッドは,次に説明する相違点を除いてルートリソースクラスの場合と同じです。ルートリソースクラスについては,次の個所を参照してください。
サブリソースロケータの戻り値の型がvoidの場合,エラーとなり,クライアントからのHTTPリクエストは処理されません。HTTPステータスコードには500が返されます。なお,ログはJAX-RS機能のログファイルではなく,J2EEサーバのログファイルを確認してください。
次に示す条件に当てはまる場合は,エラーとなり(KDJJ10006-E),例外マッピングプロバイダで処理できるjava.lang.RuntimeExceptionがスローされます。
-
一つのリソースメソッドに対し,二つ以上の要求メソッド識別子を使用している場合
-
二つ以上のリソースメソッドに対し,同じ要求メソッド識別子を使用している場合
-
サブリソースロケータがエンティティパラメタを持っている場合