XJC生成整数而不是int

时间:2011-09-01 12:35:49

标签: xsd jaxb code-generation xjc

以下架构应该在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

1 个答案:

答案 0 :(得分:20)

我不完全确定这是答案,但在调试我的应用程序时我有顿悟。

XML架构中元素的默认多重性为1..1 (required),其中属性的默认多重性为0..1 (optional)

  1. 因此,由于元素必需并且Java中的基元具有默认值(很可能为0),因此生成{{{ 1}}作为Java原语。

  2. 由于属性可选,因此有可能<xsd:element type="xsd:int" />使用基元无法实现。 java.lang.Integernillable,因此可以Object,因此生成null作为java.lang.Integer是有意义的。

  3. 如果您属性需要 <xsd:attribute type="xsd:int" />),它将生成原始<xsd:attribute type="xsd:int" use="required" />。我没有看到JAXB明确说明这一点的文档,但这并不意味着它不存在;也许我只是错过了它。