【问题标题】:JAX-RS nested GenericEntityJAX-RS 嵌套的 GenericEntity
【发布时间】:2018-05-29 21:54:26
【问题描述】:

我有一个必须返回未知类型对象列表的 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" ] }

即对象未正确序列化。

【问题讨论】:

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

标签: generics jax-rs glassfish-4.1


【解决方案1】:

在 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>

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2015-02-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多