JAXB(2):可以抑制不需要的列表包装器元素吗

JAXB(2):可以抑制不需要的列表包装器元素吗,jaxb,jaxb2,Jaxb,Jaxb2,对于多重性>1的元素(即maxOccurs>1或maxOccurs=未绑定),例如: JAXB生成以下代码: @XmlElement(name = "Name") protected List<type> name; @xmlement(name=“name”) 受保护名单名称; 严格地说,上面的模式描述了一个XML代码段,如下所示: <Name attr1="a" attr2="x"> <Name attr1="b" attr2="y"> <N

对于多重性>1的元素(即maxOccurs>1或maxOccurs=未绑定),例如:


JAXB生成以下代码:

@XmlElement(name = "Name")
protected List<type> name;
@xmlement(name=“name”)
受保护名单名称;
严格地说,上面的模式描述了一个XML代码段,如下所示:

<Name attr1="a" attr2="x">
<Name attr1="b" attr2="y">
<Name attr1="c" attr2="z">

i、 e.一系列“名称”元素(仅此而已!)

当将Java对象编组为XML时,JAXB运行时将创建XML,该XML在列表周围包含一个附加的包装器元素,如下所示:

<Name>
    <Name attr1="a" attr2="x">
    <Name attr1="b" attr2="y">
    <Name attr1="c" attr2="z">
<Name>
@XmlElementWrapper(name = "NameList")
@XmlElement(name = "Name")
protected List<Type> name;

默认情况下,包装元素与各个项目具有相同的名称。请注意,没有表示该元素的Java类

您可以通过手动(!)添加java注释“@XmlElementWrapper”注释来推翻命名,如下所示:

<Name>
    <Name attr1="a" attr2="x">
    <Name attr1="b" attr2="y">
    <Name attr1="c" attr2="z">
<Name>
@XmlElementWrapper(name = "NameList")
@XmlElement(name = "Name")
protected List<Type> name;
@xmlementwrapper(name=“NameList”)
@xmlement(name=“name”)
受保护名单名称;
然后生成以下XML:

<NameList>
    <Name attr1="a" attr2="x">
    <Name attr1="b" attr2="y">
    <Name attr1="c" attr2="z">
<NameList>

我同意这样一个包装器元素在语法上很好,使XML更具可读性,但这有一个严重的问题:生成的Java代码(有或没有重命名包装器元素)生成并期望一种XML方言,严格来说,不再与原始模式匹配在原始模式中没有提及或隐含任何此类包装器元素的概念

如果在不同的工具中使用原始模式(例如,创建web表单或不同的基于模式的代码生成器),并且其结果遵循和/或期望原始XML(即,没有任何包装器元素的裸序列),则问题才会出现,而JAXB生成的代码创建并坚持包装器元素的存在。那两个人就不能互相理解了

因此,我的问题是:在编组/解编组XML时,如何指示JAXB不添加/期望所述包装器元素


我已经在网上搜索了很长一段时间,寻找解决方案或解决办法,但什么也没找到!我无法想象以前没有人会在这个问题上犯错误,而且除了手工调整XML编组/解编组代码之外,似乎没有其他解决方案。有什么想法或建议可以解决这个问题吗?

你能发布一个小而完整的XSD来演示这个问题,以及你的编组代码吗?因为通常情况下,它不应该自动创建这个额外的包装器元素!由您的响应触发,我创建了一个最低限度的模式,创建了绑定,然后通过它运行一些数据,即将它们编组到一个文件,并将它们解组回Java POJO,结果与上面的第一个XML片段完全相同,即生成并接受的XML只包含一个基本的“名称”列表没有任何包装器元素的元素。因此,在我们的案例中,罪魁祸首似乎不是JAXB或其运行时,而是原因隐藏在SpringBoot中的某个地方,我们使用SpringBoot来解压REST请求的有效负载。道歉!你能发布一个小的,但完整的XSD来演示这个问题,以及你的封送代码吗?因为通常情况下,它不应该自动创建这个额外的包装器元素!由您的响应触发,我创建了一个最低限度的模式,创建了绑定,然后通过它运行一些数据,即将它们编组到一个文件,并将它们解组回Java POJO,结果与上面的第一个XML片段完全相同,即生成并接受的XML只包含一个基本的“名称”列表没有任何包装器元素的元素。因此,在我们的案例中,罪魁祸首似乎不是JAXB或其运行时,而是原因隐藏在SpringBoot中的某个地方,我们使用SpringBoot来解压REST请求的有效负载。道歉!