48.4. 返回包含通用类型信息的实体

概述

对于返回对象的 MIME 类型或用于对响应进行序列化的实体供应商,应用程序需要更多地控制。JAX-RS javax.ws.rs.core.GenericEntity<T > 类通过提供指定代表实体的通用对象类型的机制来控制实体的序列化。

使用 GenericEntity<T> 对象

用于选择排序响应的实体提供程序的一个条件是对象的通用类型。对象的通用类型代表对象的 Java 类型。当返回常见 Java 类型或 JAXB 对象时,运行时可以使用 Java 反映来确定通用类型。但是,当返回 JAX-RS response 对象时,运行时无法确定嵌套的实体的通用类型,对象的实际 Java 类用作 Java 类型。

为确保实体供应商提供正确的通用类型信息,在将 实体添加到返回的 Response 对象之前,可以将该实体嵌套在通用 类型信息中。

资源方法也可以直接返回 GenericEntity<T> 对象。实际上,这种方法很少被使用。通过反映未封装的实体以及存储在通用 实体的通用类型信息,通用 类型信息通常相同。

创建通用<T> 对象

创建 通用Entity<T&gt; 对象的方法有两种:

  1. 使用被嵌套的实体,创建 GenericEntity<T > 类的子类。使用子类创建通用保护<T> 对象 显示如何创建包含类型为 List<String& gt; 的 GenericEntity<T & gt; 对象,其通用类型在运行时可用。

    使用子类创建通用保护<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 “直接实例化通用<T> 对象” 演示了如何创建包含 AtomicInteger 实体的响应。

    例 48.2. 直接实例化通用<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();