Привязки свойств JAXB — зачем это вообще нужно

У меня есть следующий xsd (здесь я публикую только соответствующую часть, но команда также выполнялась для этого отрывка)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:complexType name="OptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="name" use="optional"/>
                <xs:attribute type="xs:string" name="value" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="ControllableType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:float" name="value" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

Я запускаю следующую команду против него:

xjc src/main/resources/session.xsd -p org.myorg.mypackage -d src/main/java/org/myorg/mypackage

Я получаю следующую ошибку:

[ERROR] Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd

[ERROR] The following location is relevant to the above error
line 14 of file:/home/user/project/src/main/resources/session.xsd

[ERROR] Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd

[ERROR] The following location is relevant to the above error
line 7 of file:/home/user/project/src/main/resources/session.xsd

Failed to parse a schema.

Я читал кое-что о привязках здесь:

Символ уже определен. Используйте свойство JAXB для разрешения конфликта

Проблема компиляции JAXB - [ОШИБКА] Свойство Any уже определено

Но зачем это вообще нужно? Разве атрибут не является полностью квалифицированным и уникальным по имени элемента XML в сочетании с именем атрибута?

Как "OptionType.value" или "ControllableType.value"


person Christian    schedule 20.08.2017    source источник
comment
Ожидание появления Блейза Догана...   -  person Hovercraft Full Of Eels    schedule 21.08.2017


Ответы (2)


Проблема в том, что у вас сложный тип с простым содержимым и атрибутом value:

<xs:complexType name="ControllableType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:float" name="value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

Это позволит что-то вроде

<somelement value="1.5">one and a half</somelement>

XJC пытается создать два свойства:

  • один для атрибута value,
  • один для простого содержания.

Первое свойство по умолчанию называется value, потому что это имя атрибута.

Второе свойство по умолчанию называется value, потому что это имя по умолчанию для простых свойств содержимого.

Это приводит к столкновению.

person lexicore    schedule 21.08.2017

Похоже, вы пытаетесь расширить java.lang.String. Но поскольку класс String уже содержит атрибут «значение», вы не можете использовать его в своих дочерних классах.

Я предполагаю, что можно упустить из виду, что класс String является окончательным и поэтому не может быть расширен. Когда вы переименуете свой атрибут «значение», вы увидите, что xjc будет работать, но он по-прежнему не будет расширять String в сгенерированном коде (поскольку это невозможно), но xjc, по-видимому, все еще проверяет, действительны ли ваши имена атрибутов, что вызывает проблему .

@lexicore объяснил в комментариях, почему это предположение неверно:


ИЗМЕНИТЬ с учетом комментариев лексикоров

Итак, ваши варианты - переименовать ваше «значение». Проверьте ответ @lexicores, чтобы понять, почему.

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:string" name="name" use="optional"/>
            <xs:attribute type="xs:string" name="my_value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="ControllableType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:float" name="my_value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

or not to use an xs:extension within xs:simpleContent.

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="value" use="optional"/>
</xs:complexType>
<xs:complexType name="ControllableType">
    <xs:attribute type="xs:float" name="value" use="optional"/>
</xs:complexType>

person giro    schedule 21.08.2017
comment
Нет, речь не идет о расширении java.lang.String (что в любом случае невозможно). - person lexicore; 21.08.2017
comment
Так что же тогда делает ‹xs:extension base=xs:string›? - person giro; 21.08.2017
comment
Он определяет базовый тип для простого содержимого сложного типа. Вы написали Похоже, вы пытаетесь расширить java.lang.String, что здесь не так. - person lexicore; 21.08.2017
comment
Прохладный. Сначала я этого не понял. Так я бы отредактировал свой ответ или удалил его, так как он неправильный? - person giro; 21.08.2017
comment
Я бы просто добавил жирным шрифтом примечание, что ответ, по-видимому, неверен. Удалять или нет решать вам. Отредактируйте его, если хотите, и считаете, что моего ответа недостаточно. - person lexicore; 21.08.2017