XJC генерирует целое число вместо int - PullRequest
7 голосов
/ 01 сентября 2011

Следующая схема должна генерировать два примитивных 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?

1 Ответ

20 голосов
/ 01 сентября 2011

Я не совсем уверен, что это ответ, но у меня было прозрение при отладке моего приложения.

Кратность по умолчанию для элемента в XML-схеме равна 1..1 (required)где кратность по умолчанию для атрибута равна 0..1 (optional).

  1. Таким образом, поскольку элемент равен , требуется и примитив в Java имеет значение по умолчанию (скорее всего, 0), имеет смысл сгенерировать <xsd:element type="xsd:int" /> как примитив Java.

  2. , поскольку атрибут необязательно есть вероятность, что это может быть nillable, что было бы невозможно при использовании примитива. java.lang.Integer является Object и, следовательно, может быть null, поэтому имеет смысл сгенерировать <xsd:attribute type="xsd:int" /> как java.lang.Integer .

Если вы сделаете атрибут be обязательный (<xsd:attribute type="xsd:int" use="required" />), он будет сгенерирован как примитив int.Я не видел документации JAXB, в которой это прямо сказано, но это не значит, что ее не существует;возможно я просто пропустил это.

...