Menu Close

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();