【发布时间】:2016-05-14 06:28:36
【问题描述】:
我有一个 MessageBodyReader 有以下课程:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class TransactionMessageBodyReader implements MessageBodyReader<Transaction<Customer>>
boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType)
我有以下 REST 端点:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("trans")
public Response checkStatus(Transaction<Customer> transaction) { ... }
在我的调试器中,我在isReadable 上有一个断点,它在调用checkStatus 方法之前到达断点。目前很好。我可以在我的调试器中看到genericType 说Transaction<Customer> ...换句话说,它知道类型信息。当 Java 类型擦除在运行时将其擦除为 Transaction 时,它怎么可能知道类型信息?我看到genericType 由ParameterizedType 组成,我相信它用于传递类型信息(以解决类型擦除问题)。然而,泽西岛是如何自动填充genericType 的?因为除了上面发布的方法头之外,我从未指定类型信息。
另外,第二个问题:如果 Jersey '自动'知道这么多关于我的类型,我为什么需要 MessageBodyReader 呢?难道没有一些更简单的方法可以将泛型与 Jersey/REST 端点一起使用并使其“正常工作”吗?
【问题讨论】:
-
实际上,正是因为有
MessageBodyReader实现,它才能神奇地工作。另见stackoverflow.com/questions/19860393/… -
@Tunaki 我知道,但为什么呢? MessageBodyReader 是如何真正知道类型信息的? (它也是类型擦除 - 对吧?)。
-
我怀疑这是使用标准技巧:类型擦除会擦除 objects 中的泛型,但不会擦除 classes。
-
这里有一个黑魔法:stackoverflow.com/a/15999255/1743880。
-
@Tunaki 我有点明白但不完全。我没有在任何地方创建匿名类。在给出的示例中,作者创建了一个匿名类并将其传递给一个方法。我没有在任何地方这样做。那么我的类型不会在运行时被擦除吗?