Menu Close

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 を参照してください。