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
> 对象中。
资源方法也可以直接返回 GenericEntity<T>
对象。实际上,这种方法很少被使用。通过反映未封装实体以及存储在 GenericEntity<T> 对象中的实体的通用类型信息所确定的
通用类型信息通常相同。
创建 GenericEntity<T> 对象
创建 GenericEntity<T>
; 对象的方法有两种:
使用所包装实体,创建
GenericEntity<T
> 类的子类。使用子类创建 GenericEntity<T> 对象 演示了如何创建一个GenericEntity<T>
对象,其中包含一个类型List<String&
gt; 的实体,其通用类型将在运行时可用。使用子类创建 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>
; 对象的子类通常是匿名的。通过向实体提供通用类型信息来直接创建一个实例。例 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();