Jaxb生成的类使用了JAXBElement而不是指定的类型

9
这个问题以不同的形式被提出过,但我觉得还有进一步分类的空间。
我有一个包含两个元素定义的xsd。
<xs:complexType name="elementA">
   <xs:sequence>
      <xs:element name="date" type="xs:string" minOccurs="0"/>
      <xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="0"/>
   </xs:sequence>
</xs:complexType>

这将生成:
protected String date;
@XmlElementRef(name = "lastXdigits", namespace = "http://xxxxxxx", type = JAXBElement.class)
protected JAXBElement<String> lastXDigits;

将xsd更改为:

<xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="1"/>

导致结果如下:

protected String date;
@XmlElement(name = "lastXdigits", required = true, nillable = true)
protected String lastXDigits;

并使用:

<xs:element name="lastXdigits" type="xs:string" minOccurs="0"/>

结果是:

protected String date;
@XmlElement(name = "lastXdigits")
protected String lastXDigits;

这对我来说似乎非常奇怪。为什么在第一个案例中lastXDigits生成为JAXBElement类型,而在所有情况下字符串类型不足以满足要求?此外,除了名称之外,这两个元素的定义相同,为什么jaxb要将它们区别对待?
我正在使用来自jaxb 2.0.5的jaxb-xjc ant任务。
这看起来可疑,还是有充分的理由解释这些差异?
1个回答

8
如果nillable="true"minOccurs="0"一起使用,那么仅用String表示这些值是不可能的。null是什么意思?它表示它为空还是出现了0次?但是我猜当它只是一个字符串时这有点无关紧要。
与空列表进行比较。一个空列表肯定不同于一个空的列表。

1
我猜如果你对元素不存在和元素值为空之间的区别感兴趣,这可能是相关的,但我想在大多数情况下,没有人真正关心这个额外的间接层只是一个麻烦。 - Ellis
1
是的,但我想在某些情况下这可能是一个有效的区分。 - Martin Algesten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接