【问题标题】:No Wrapper Element when returning List返回列表时没有包装元素
【发布时间】:2013-02-01 14:20:25
【问题描述】:

我正在使用 JAX-RS / JAXB 和 JPA 来创建 REST Web 服务。

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public List<MyObject> getList() {
    List<MyObject> resultList = em.createNamedQuery(
            "MyObject.findAll").getResultList();
    return resultList;
}

返回

{
    "MYObject": [
        {
            "attribute": "value"
        },
        {
            "attribute": "value"
        }
    ]
}

对于 xml:

    <mYObject>
      <MObject>
        <attribute>value</attribute>
      </MyObject>
      <MyObject>
        <attribute>value</attribute>
      </MyObject>
    </mYObject>

我怎样才能摆脱包装元素?好的,xml 需要一个根元素 (mYObject) 但我该如何重命名它? JSON 是否有可能有这样的输出:

   [
        {
            "attribute": "value"
        },
        {
            "attribute": "value"
        }
    ]

==> 没有 Wrapper 对象,只有包含所有对象的普通数组?

【问题讨论】:

  • 网络服务在...什么? IE。哪个容器。

标签: jakarta-ee jaxb jackson jax-rs


【解决方案1】:

不知道我说得对不对。但我猜你想要:

  1. 重命名我的对象
  2. 摆脱 MyObject

对于问题 1,

-- 您可以使用 @XmlRootElement(name="NOTmYObject") 将其覆盖为 NOTmYObject。

对于问题 2,

-- 如果您希望 POJO 中的数据结构与 HTTP 中的 json 不同,JaxB 不会假设这种灵活性。 JaxB 严格地将其视为数据结构,就像服务和客户端之间的合同一样。使用 xsd 文件来定义这个合同更加困难。或者如果你真的需要那种灵活性,你可能想看看jackson

【讨论】:

  • 谢谢 :) 1) 不起作用,它将每个元素的标签重命名为“MYObject”。但不是外部“包装器-/ListTag”元素“mYObjects”。对于 2):我并不是希望 POJO 结构有所不同——我返回一个对象的 ArrayList,所以我期望一个带有对象的数组。而不是包含对象数组的对象...
  • 1) 指定包装标签没有简单的解决方案。检查this 以获取使用“@Provider”的解决方案。 2)这就是 JaxRS 处理 List 编组的方式,您可以使用“@Provider”来指定您自己的方式。
【解决方案2】:

我决定继续使用默认的列表编组。

但是,如果您想归档自定义编组和命名,则必须编写自己的 MessageBodyReaderMessageBodyWriter

【讨论】:

    【解决方案3】:

    MyObject 中使用@XmlValue 来注释attribute

    【讨论】:

    • 我不能在类上使用@XmlValue 注解。
    • attributeMyObject 类的属性,而不是类
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多