7

以下模式应该int在一个类中生成两个原始字段Value,而是int元素生成一个原始字段,为属性生成java.lang.Integer

<?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>

我查看了JAXB 文档中的任何内容,即属性和元素的生成方式可能不同,但什么也没找到。

谁能解释一下?是否有使属性生成为原语的修复程序int

4

1 回答 1

22

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

XML 模式中元素的默认1..1 (required)多重性是属性的默认多重性是0..1 (optional)

  1. 因此,由于该元素必需<xsd:element type="xsd:int" />的,并且 Java 中的原语具有默认值(很可能是 0),因此生成一个作为 Java 原语是有意义的。

  2. 由于该属性可选的,因此它可能是nillable使用原语无法实现的。java.lang.Integer是 anObject并因此被允许,因此将an 生成为java.lang.Integernull是有意义的。<xsd:attribute type="xsd:int" />

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

于 2011-09-01T16:24:14.257 回答