以下架构应该在int
类中生成两个原始Value
字段,而是为元素和{{3}生成原始int
对于属性。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/test" xmlns:test="http://www.example.com/test"
elementFormDefault="qualified">
<xsd:element name="values">
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="test:value" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="value">
<xsd:complexType>
<xsd:sequence>
<!-- Is generated as primitive int -->
<xsd:element name="element" type="xsd:int" />
</xsd:sequence>
<!-- Is generated as java.lang.Integer -->
<xsd:attribute name="attribute" type="xsd:int" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
我已经查看了java.lang.Integer的任何内容,表明属性和元素可能会以不同的方式生成而且一无所获。
任何人都能解释一下吗?是否有修复方法可以将属性生成为基元int
?
答案 0 :(得分:20)
我不完全确定这是答案,但在调试我的应用程序时我有顿悟。
XML架构中元素的默认多重性为1..1 (required)
,其中属性的默认多重性为0..1 (optional)
。
因此,由于元素是必需并且Java中的基元具有默认值(很可能为0),因此生成{{{ 1}}作为Java原语。
由于属性是可选,因此有可能<xsd:element type="xsd:int" />
使用基元无法实现。 java.lang.Integer是nillable
,因此可以Object
,因此生成null
作为java.lang.Integer是有意义的。
如果您属性需要 (<xsd:attribute type="xsd:int" />
),它将生成原始<xsd:attribute type="xsd:int" use="required" />
。我没有看到JAXB明确说明这一点的文档,但这并不意味着它不存在;也许我只是错过了它。