JAXB何时生成@XmlElementRef和@XmlElement类型的注释?

时间:2015-12-15 10:04:56

标签: java xml xsd jaxb

这个问题已经以不同的方式被多次询问,但我在这里从不同的角度进行查询。所以,让我们举个例子:

<xs:element name="Ric" type="String" nillable="true" minOccurs="0"/>

对于XSD中的上一行,JAXB生成如下代码:

@XmlElementRef(name = "Ric", type = JAXBElement.class, required = false)
    protected JAXBElement<String> ric;

但是对于跟随xsd元素,

<xs:element name="Ric" type="String" minOccurs="0"/>

我明白了,

 @XmlElement(name = "Ric")
    protected String ric;

我已经阅读了@XmlElement@XmlElementRef之间差异的几种解释,但由于我对使用XSD很新,我无法理解他们想说的是什么。我所能掌握的是,nillable="true"就是这种情况。有人可以用外行人的语言解释为什么JAXB为具有nillable="true"minOccur="0"的元素生成参数类型。我知道我们也可以取消其中一个,但客户需要这样。

jaxb版本:2.2.11

1 个答案:

答案 0 :(得分:3)

JAXB是关于Java和XML之间两个方向的映射。

因此对于以下架构:

<xs:element name="Ric" type="String" minOccurs="0"/>

像Java一样:

protected String ric;  
带有ric = null

明确地映射到缺少“Ric”元素(即父元素具有零“Ric”子元素)。

但对于以下架构:

<xs:element name="Ric" type="String" nillable="true" minOccurs="0"/>

你不知道等于'null'的String是映射到零“Ric”元素还是值为xsi:nil的“Ric”元素。所以你需要额外的 JAXBElement 包装来区分。

查看已接受的答案here

不确定我的回答是否比那更容易理解......但也许它有所帮助。