【发布时间】:2012-11-28 08:49:32
【问题描述】:
我正在使用 Jersey 编写一个 REST 服务。我有一个带有注释的抽象类 Promotion:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
多亏了这一点,当我返回一个对象列表时:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("promotions/")
public List<Promotion> getClosestPromotions() {
List<Promotion> promotions = getPromotions(); //here I get some objects
return promotions;
}
我为该列表中的每个对象获得了一个带有“@class”字段的 Json 字符串。但问题是,如果我返回一个响应:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("promotions/")
public Response getClosestPromotions() {
List<Promotion> promotions = getPromotions(); //here I get some objects
return Response.ok().entity(promotions).build();
}
我得到了几乎相同的列表,但没有额外的“@class”字段。 为什么会这样,我该怎么做才能得到一个带有“@class”字段的列表,在响应中返回一个列表? 顺便说一句,令人惊讶的是,当我返回一个仅作为实体给出的 Promotion 对象的 Response 并且我得到那个“@class”字段时,它就起作用了。
【问题讨论】:
-
我还没有足够的答案,但是。实体方法接受一个对象。底层代码可能会在运行时检查类型以恢复类型信息。不幸的是,这将得到它,而不是 List
。它把它写成一个没有泛型类型信息的列表,因此你会丢失类字段。编写一个将列表作为成员变量的对象可能会起作用,但我正试图想出一些更干净的东西。
标签: java json rest jersey jackson