18.3. モデルスキーマでの REST サービスの定義
アノテーションなしの RESTful サービス リンクのコピーリンクがクリップボードにコピーされました!
JAX-RS モデルスキーマを使用すると、Java クラスにアノテーションを 付けずに RESTful サービスを定義できます。つまり、Java クラス (またはインターフェイス) に直接 @Path、@PathParam、@Consumes、@Produces などのアノテーションを追加する代わりに、モデルスキーマを使用して、関連する REST メタデータをすべて別の XML ファイルで指定できます。これは、たとえば、サービスを実装する Java ソースを変更できない場合に役立ちます。
モデルスキーマの例 リンクのコピーリンクがクリップボードにコピーされました!
例18.1「サンプル JAX-RS モデルスキーマ」は、BookStoreNoAnnotations ルートリソースクラスのサービスメタデータを定義するモデルスキーマの例を示しています。
例18.1 サンプル JAX-RS モデルスキーマ
namespace リンクのコピーリンクがクリップボードにコピーされました!
モデルスキーマの定義に使用する XML 名前空間は、対応する JAX-RS エンドポイントを Blueprint XML で定義するか Spring XML で定義するかによって異なります。次の表は、どの XML 言語にどの名前空間を使用するかを示しています。
| XML 言語 | Namespace |
|---|---|
| ブループリント | |
| Spring |
モデルスキーマをエンドポイントにアタッチする方法 リンクのコピーリンクがクリップボードにコピーされました!
モデルスキーマを定義してエンドポイントにアタッチするには、次の手順を実行します。
- 選択したインジェクションプラットフォーム (Blueprint XML または Spring XML) に適切な XML 名前空間を使用して、モデルスキーマを定義します。
モデルスキーマファイルをプロジェクトのリソースに追加して、スキーマファイルが最終パッケージ (JAR、WAR、または OSGi バンドルファイル) のクラスパスで使用できるようにします。
注記あるいは、エンドポイントの
jaxrs:model子要素を使用して、モデルスキーマを直接 JAX-RS エンドポイントに組み込むこともできます。-
エンドポイントの
modelRef属性をクラスパス上のモデルスキーマの場所に設定し (クラスパス URL を使用)、モデルスキーマを使用するようにエンドポイントを設定します。 -
必要な場合は、
jaxrs:serviceBeans要素を使用して、ルートリソースを明示的にインスタンス化します。モデルスキーマが (ベースインターフェイスを参照する代わりに) ルートリソースクラスを直接参照する場合は、この手順をスキップできます。
クラスを参照するモデルスキーマの設定 リンクのコピーリンクがクリップボードにコピーされました!
モデルスキーマがルートリソースクラスに直接適用される場合、モデルスキーマは自動的にルートリソース Bean をインスタンス化するため、jaxrs:serviceBeans 要素を使用してルートリソース Bean を定義する必要はありません。
たとえば、customer-resources.xml がメタデータをカスタマーリソースクラスに関連付けるモデルスキーマの場合、以下のように customerService サービスエンドポイントをインスタンス化できます。
<jaxrs:server id="customerService"
address="/customers"
modelRef="classpath:/org/example/schemas/customer-resources.xml" />
<jaxrs:server id="customerService"
address="/customers"
modelRef="classpath:/org/example/schemas/customer-resources.xml" />
インターフェイスを参照するモデルスキーマの設定 リンクのコピーリンクがクリップボードにコピーされました!
モデルスキーマが Java インターフェイス (ルートリソースのベースインターフェイス) に適用される場合、エンドポイントの jaxrs:serviceBeans 要素を使用してルートリソースクラスをインスタンス化する必要があります。
たとえば、customer-interfaces.xml がメタデータをカスタマーリソースクラスに関連付けるモデルスキーマの場合、以下のように customerService サービスエンドポイントをインスタンス化できます。
モデルスキーマリファレンス リンクのコピーリンクがクリップボードにコピーされました!
モデルスキーマは、次の XML 要素を使用して定義されます。
model-
モデルスキーマのルート要素。モデルスキーマを参照する必要がある場合は (たとえば、
modelRef属性を使用して JAX-RS エンドポイントから)、この要素のid属性を設定する必要があります。 model/resourceresource要素は、メタデータを特定のルートリソースクラス (または対応するインターフェイス) に関連付けるために使用されます。resource要素に以下の属性を定義できます。Expand Attribute 説明 nameこのリソースモデルが適用されるリソースクラス (または対応するインターフェイス) の名前。
+
pathこのリソースにマップする REST URL パスのコンポーネント。
+
consumesこのリソースによって使用されるコンテンツの型 (インターネットメディアの型) を指定します (例:
application/xmlまたはapplication/json)。+
producesこのリソースによって使用されるコンテンツの型 (インターネットメディアの型) を指定します (例:
application/xmlまたはapplication/json)。+
model/resource/operationoperation要素は、メタデータを Java メソッドに関連付けるために使用されます。operation要素に以下の属性を定義できます。Expand Attribute 説明 nameこの要素が適用される Java メソッドの名前。
+
pathこのメソッドにマップする REST URL パスのコンポーネント。この属性値には、パラメーターの参照を含めることができます (例:
path="/books/{id}/chapter")。ここで、{id}はパスからidパラメーターの値を抽出します。+
verbこのメソッドにマップする HTTP 動詞を指定します。通常、
GET、POST、PUT、またはDELETEのいずれかです。HTTP の動詞が指定されて いない 場合、Java メソッドは サブリソースロケーター と考えられ、サブリソースオブジェクトへの参照を返します (サブリソースクラスにもresource要素を使用してメタデータを指定する必要があります)。+
consumesこの操作によって消費されるコンテンツタイプ (インターネットメディアタイプ) を指定します (例:
application/xmlやapplication/json)。+
producesこの操作で生成されるコンテンツタイプ (インターネットメディアタイプ) を指定します (例:
application/xmlやapplication/json)。+
onewaytrueの場合、操作を 一方向 に設定します。つまり、リプライメッセージは不要になります。デフォルトはfalseです。+
model/resource/operation/paramparam要素は、REST URL から値を抽出し、それをメソッドパラメーターのいずれかに注入するために使用されます。param要素で以下の属性を定義できます。Expand Attribute 説明 nameこの要素が適用される Java メソッドパラメーターの名前。
+
typeパラメーター値を REST URL またはメッセージから抽出する方法を指定します。
PATH、QUERY、MATRIX、HEADER、COOKIE、FORM、CONTEXT、REQUEST_BODYのいずれかの値に設定できます。+
defaultValueREST URL またはメッセージから値を抽出できなかった場合に、パラメーターに挿入するデフォルト値。
+
encodedtrueの場合、パラメーター値は URI でエンコードされた形式で挿入されます (つまり%nnエンコーディングを使用します)。デフォルトはfalseです。たとえば、URL パス (/name/Joe%20Bloggs) からパラメーターを抽出する際に、エンコードがtrueに設定されると、パラメーターはJoe%20Bloggsとして注入されます。そうでない場合は、パラメーターはJoe Bloggsとして注入されます。+