JAX-RS嵌套GenericEntity

时间:2018-05-29 21:54:26

标签: generics jax-rs glassfish-4.1

我有一个JAX-RS 2.0服务,必须返回未知类型的对象列表。 此外,我希望此列表嵌套在包装器对象中。 所以,例如,我想产生这个输出:

{ "objects": [ {"name":"goofy"}, {"name":"mickey"} ] }

如果对象'类型是众所周知的,这是一项简单的任务。 我已经尝试过很多方面,包括使用GenericEntity,但我找不到解决方案。

我正在使用WAS Glassfish 4.1,但我希望解决方案独立于特定的WAS。

这是该服务的相关代码:

@GET
@Path("{entity}")
public Response find(@PathParam("entity") String entity) {
    Class clazz = someMethod(entity);
    List list = someMethod(clazz);   //return a list of object of clazz
    WrapperClass wrapper = new WrapperClass();
    wrapper.setObjects(list);
    return Response.ok().entity(wrapper).build();
}

此代码生成输出:

{ "objects": [ "object goofy", "object mickey" ] }

即。对象未正确序列化。

1 个答案:

答案 0 :(得分:1)

使用Glassfish 4,默认的JSON提供程序是MOXy,它构建在JAXB之上。使用JAXB,需要事先知道实体类型。因此,您获得的结果只是toString()的值,这是不知道类型时的行为。

如果您想切换到使用Jackson作为JSON提供程序,它应该可以工作。杰克逊不需要事先知道这种类型,因为它只是内省了所有的bean属性。要在Glassfish中使用Jackson,您需要将依赖项添加到项目中,并在应用程序中注册JackonFeature

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
    <scope>provided</scope>
</dependency>