48.4. 汎用型情報を含むエンティティーの返答

概要

アプリケーションで、返されたオブジェクトの MIME タイプや、応答のシリアル化に使用するエンティティープロバイダーを詳細に制御する必要がある場合があります。JAX-RS javax.ws.rs.core.GenericEntity<T> クラスは、エンティティーを表すオブジェクトの汎用型を指定するメカニズムを提供することで、エンティティーのシリアライズに対する詳細な制御を可能にします。

GenericEntity<T> オブジェクトの使用

応答をシリアライズするエンティティープロバイダーの選択に使用される基準の 1 つは、オブジェクトの汎用型です。オブジェクトの汎用型はオブジェクトの Java 型を表します。一般的な Java 型または JAXB オブジェクトが返されると、ランタイムは Java リフレクションを使用して汎用型を判断できます。ただし、JAX-RS Response オブジェクトが返されると、ランタイムはラップされたエンティティーの汎用型を決定できず、オブジェクトの実際の Java クラスが Java 型として使用されます。

エンティティープロバイダーに正しい汎用型情報が提供されるようにするため、エンティティーは返された Response オブジェクトに追加される前に、GenericEntity<T> オブジェクトでラップされます。

リソースメソッドは、GenericEntity<T> オブジェクトを直接返すこともできます。実際には、このアプローチはほぼ使用されません。通常、ラップされていないエンティティーのリフレクションによって決定される汎用型情報や、GenericEntity<T> オブジェクトでラップされたエンティティーに格納される汎用型情報は、通常同じです。

GenericEntity<T> オブジェクトの作成

GenericEntity<T> オブジェクトを作成する方法は 2 つあります。

  1. ラップされるエンティティーを使用して GenericEntity<T> クラスのサブクラスを作成します。サブクラスを使用した GenericEntity<T> オブジェクトの作成 は、実行時に利用可能な汎用型を持つ型 List<String> のエンティティーが含まれる GenericEntity<T> オブジェクトを作成する方法を示しています。

    サブクラスを使用した GenericEntity<T> オブジェクトの作成

    import javax.ws.rs.core.GenericEntity;
    
    List<String> list = new ArrayList<String>();
    ...
    GenericEntity<List<String>> entity =
      new GenericEntity<List<String>>(list) {};
    Response response = Response.ok(entity).build();

    GenericEntity<T> オブジェクトの作成に使用されるサブクラスは通常、匿名です。

  2. エンティティーに汎用型情報を指定して、インスタンスを直接作成します。例48.2「GenericEntity<T> オブジェクトの直接インスタンス化」 は、AtomicInteger 型のエンティティーが含まれる応答を作成する方法を示しています。

    例48.2 GenericEntity<T> オブジェクトの直接インスタンス化

    import javax.ws.rs.core.GenericEntity;
    
    AtomicInteger result = new AtomicInteger(12);
    GenericEntity<AtomicInteger> entity =
      new GenericEntity<AtomicInteger>(result,
                                          result.getClass().getGenericSuperclass());
    Response response = Response.ok(entity).build();