Generics JAX-RS嵌套泛型实体
我有一个JAX-RS2.0服务,它必须返回未知类型的对象列表。 此外,我希望该列表嵌套在包装器对象中。 例如,我想生成以下输出: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
{ "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的两个实现给出了如此不同的结果。因为没有其他人发表过答案,如果你详细说明一下,我会接受你的答案。