这个问题已经以不同的方式被问过多次,但我在这里从不同的角度提出疑问。那么让我们来看下面的例子:
<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
最佳答案
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”的字符串是映射到零“Ric”元素还是映射到值为 xsi:nil
的“Ric”元素。因此,您需要额外的 JAXBElement 包装器来区分。
查看已接受的答案 here .
不确定我的回答比那个更容易理解..但也许它有所帮助。
关于java - JAXB 何时生成@XmlElementRef 和@XmlElement 类型的注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34286196/