JAX-RS 嵌套的 GenericEntity
JAX-RS nested GenericEntity
我有一个 JAX-RS 2.0 服务,它必须 return 一个未知类型的对象列表。
此外,我希望将此列表嵌套在包装器对象中。
所以,例如,我想产生这个输出:
{ "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" ] }
即对象没有正确序列化。
对于 Glassfish 4,默认的 JSON 提供程序是构建在 JAXB 之上的 MOXy。使用 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>
我有一个 JAX-RS 2.0 服务,它必须 return 一个未知类型的对象列表。 此外,我希望将此列表嵌套在包装器对象中。 所以,例如,我想产生这个输出:
{ "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" ] }
即对象没有正确序列化。
对于 Glassfish 4,默认的 JSON 提供程序是构建在 JAXB 之上的 MOXy。使用 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>