48.3. アプリケーションの応答の微調整

48.3.1. 応答構築の基本

概要

RESTful サービスでは、リソースメソッドがプレーンな Java コンストラクトを返す場合に、コンシューマーへ返される応答をより正確に制御する必要があります。JAX-RS Response クラスを使用すると、リソースメソッドがコンシューマーに送信される戻り値をある程度制御し、応答に HTTP メッセージヘッダーとクッキーを指定できます。

Response オブジェクトは、コンシューマーに返されるエンティティーを表すオブジェクトをラップします。Response オブジェクトは ResponseBuilder クラスをファクトリーとして使用してインスタンス化されます。

ResponseBuilder クラスには、応答のメタデータを操作するために使用されるメソッドも多数あります。たとえば、ResonseBuilder クラスには、HTTP ヘッダーとキャッシュ制御ディレクティブを設定するメソッドが含まれます。

応答と応答ビルダーの関係

Response クラスには保護されたコンストラクターがあるため、直接インスタンス化することはできません。これらは、Response クラスによって囲まれた ResponseBuilder クラスを使用して作成されます。ResponseBuilder クラスは、そこから作成された応答にカプセル化されるすべての情報のホルダーです。ResponseBuilder クラスには、メッセージに HTTP ヘッダープロパティーを設定するすべてのメソッドもあります。

Response クラスは、適切な応答コードの設定とエンティティーのラップを容易にするメソッドを提供します。一般的な応答ステータスコードごとにメソッドがあります。エンティティー本体または必要なメタデータを含むステータスに対応するメソッドには、関連する応答ビルダーに、情報を直接設定できるバージョンが含まれています。

ResponseBuilder クラスの build() メソッドは、メソッドが呼び出される際に応答ビルダーに保存されている情報が含まれる応答オブジェクトを返します。応答オブジェクトが返されると、応答ビルダーはクリーンな状態に戻ります。

応答ビルダーの取得

応答ビルダーを取得する方法は 2 つあります。

  • Response クラスを使用した応答ビルダーの取得 に示すように、Response クラスの静的メソッドを使用します。

    Response クラスを使用した応答ビルダーの取得

    import javax.ws.rs.core.Response;
    
    Response r = Response.ok().build();

    この方法で応答ビルダーを取得すると、複数の手順で操作できるインスタンスに、アクセスできなくなります。すべてのアクションを単一のメソッド呼び出しに配列する必要があります。

  • Apache CXF 固有の ResponseBuilderImpl クラスの使用。このクラスを使用すると、応答ビルダーを直接操作できます。ただし、すべての応答ビルダーの情報を手動で設定する必要があります。

    例48.1「ResponseBuilderImpl クラスを使用した応答ビルダーの取得」は、ResponseBuilderImpl クラスを使用して Response クラスを使用した応答ビルダーの取得 を書き換える方法を表しています。

    例48.1 ResponseBuilderImpl クラスを使用した応答ビルダーの取得

    import javax.ws.rs.core.Response;
    import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;
    
    ResponseBuilderImpl builder = new ResponseBuilderImpl();
    builder.status(200);
    Response r = builder.build();
    注記

    Response クラスのメソッドから返される ResponseBuilderResponseBuilderImpl オブジェクトに割り当てることもできます。

補足情報

Response クラスの詳細は、Response クラスの Javadoc を参照してください。

ResponseBuilder クラスの詳細は、ResponseBuilder クラスの Javadoc を参照してください。

Apache CXF ResponseBuilderIml クラスの詳細は、ResponseBuilderImpl Javadoc を参照してください。