Generics JAX-RS嵌套泛型实体

Generics JAX-RS嵌套泛型实体,generics,jax-rs,glassfish-4.1,Generics,Jax Rs,Glassfish 4.1,我有一个JAX-RS2.0服务,它必须返回未知类型的对象列表。 此外,我希望该列表嵌套在包装器对象中。 例如,我想生成以下输出: { "objects": [ {"name":"goofy"}, {"name":"mickey"} ] } 如果对象的类型已知,这是一项简单的任务。 我已经尝试了很多方法,包括使用GenericEntity,但是我找不到解决方案 我使用的是WAS Glassfish 4.1,但是我希望该解决方案独立于特定WAS 这是服务的相关代码: @GET @Path("{en

我有一个JAX-RS2.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" ] }

i、 e.对象没有正确序列化。

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

如果您想切换到使用Jackson作为JSON提供程序,它应该可以工作。Jackson不需要事先知道类型,因为它只会内省所有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>

org.glassfish.jersey.media
泽西媒体公司
${jersey.version}
假如

使用Jackson作为JSON提供程序。这对杰克逊来说应该不是问题。在Glassfish中,MOXy被用作默认的提供者。好的,我尝试了你的建议,效果很好。即使我不明白为什么JAX-RS的两个实现给出了如此不同的结果。因为没有其他人发表过答案,如果你详细说明一下,我会接受你的答案。