78.6. REST リクエストの使用 - シンプルなバインディングスタイル

Camel 2.11 から利用可能

Default のバインディングスタイルはかなり低レベルであり、ユーザーはルートに入ってくる MessageContentsList オブジェクトを手動で処理する必要があります。したがって、ルートロジックを JAX-RS 操作のメソッドシグネチャーおよびパラメーターインデックスと緊密に結合します。やや洗練されておらず、難しく、エラーが発生しやすいです。

対照的に、SimpleConsumer バインディングスタイルは、キャメルメッセージ内で リクエストデータにアクセスしやすくする ために、次のマッピングを実行します。

  • JAX-RS パラメーター (@HeaderParam、@QueryParam など) は、IN メッセージヘッダーとして挿入されます。ヘッダー名は、アノテーションの値と一致します。
  • リクエストエンティティー (POJO またはその他のタイプ) は、IN メッセージの本文になります。単一のエンティティーが JAX-RS メソッド署名で識別できない場合、元の MessageContentsList にフォールバックします。
  • バイナリー @Multipart ボディパーツは IN メッセージの添付になり、DataHandlerInputStreamDataSource、および CXF の Attachment クラスをサポートします。
  • 非バイナリー @Multipart ボディパーツは、IN メッセージヘッダーとしてマップされます。ヘッダー名はボディパーツ名と一致します。

さらに、次のルールが Response マッピング に適用されます。

  • メッセージボディーのタイプが javax.ws.rs.core.Response (ユーザー作成のレスポンス) と異なる場合、新しい Response が作成され、メッセージボディーがエンティティーとして設定されます (null でない限り)。レスポンスステータスコードは、Exchange.HTTP_RESPONSE_CODE ヘッダーから取得されるか、存在しない場合はデフォルトで 200 OK になります。
  • メッセージボディーのタイプが javax.ws.rs.core.Response と等しい場合、ユーザーがカスタムレスポンスを作成したことを意味し、それが尊重されて最終的なレスポンスになります。
  • いずれの場合も、カスタムまたはデフォルトの HeaderFilterStrategy によって許可された Camel ヘッダーが HTTP 応答に追加されます。

78.6.1. Simple Binding Style の有効化

このバインディングスタイルは、コンシューマーエンドポイントの bindingStyle パラメーターを値 SimpleConsumer に設定することで有効化できます。

  from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .to("log:TEST?showAll=true");

78.6.2. 異なるメソッドシグネチャーを使用したリクエストバインディングの例

以下は、Simple バインディングから期待される結果と一緒にメソッドシグネチャーのリストです。

public Response doAction(BusinessObject request);
リクエストペイロードは、元の MessageContentsList を置き換えて、IN メッセージボディーに配置されます。

public Response doAction(BusinessObject request, @HeaderParam("abcd") String abcd, @QueryParam("defg") String defg); 元の MessageContentsList を置き換えて、IN メッセージボディーに配置されたリクエストペイロード。両方のリクエストパラメーターは、abcd および defg という名前の IN メッセージヘッダーとしてマップされます。

public Response doAction(@HeaderParam("abcd") String abcd, @QueryParam("defg") String defg); 両方のリクエストパラメーターは、abcd および defg という名前の IN メッセージヘッダーとしてマップされます。元の MessageContentsList は、2 個のパラメーターしか含まれていませんが、保持されます。

public Response doAction(@Multipart(value="body1") BusinessObject request, @Multipart(value="body2") BusinessObject request2); 最初のパラメーターは body1 という名前のヘッダーとして転送され、2 番目のパラメーターはヘッダー body2 としてマップされます。元の MessageContentsList は IN メッセージボディーとして保持されます。

public Response doAction(InputStream abcd); InputStream は MessageContentsList からアンラップされ、IN メッセージボディーとして保存されます。

public Response doAction (DataHandler abcd); DataHandler は MessageContentsList からアンラップされ、IN メッセージボディーとして保存されます。

78.6.3. Simple Binding Style のその他の例

このメソッドで JAX-RS リソースクラスを指定すると、次のようになります。

@POST @Path("/customers/{type}")
public Response newCustomer(Customer customer, @PathParam("type") String type, @QueryParam("active") @DefaultValue("true") boolean active) {
    return null;
}

以下のルートでサービスを提供します。

from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .recipientList(simple("direct:${header.operationName}"));

from("direct:newCustomer")
    .log("Request: type=${header.type}, active=${header.active}, customerData=${body}");

XML ペイロードを含む次の HTTP リクエスト (Customer DTO が JAXB アノテーション付きである場合):

POST /customers/gold?active=true

Payload:
<Customer>
  <fullName>Raul Kripalani</fullName>
  <country>Spain</country>
  <project>Apache Camel</project>
</Customer>

メッセージを出力します:

Request: type=gold, active=true, customerData=<Customer.toString() representation>

リクエストの処理方法とレスポンスの書き込み方法に関するその他の例については、こちらを 参照してください。