Как создать привязку JAXB для элемента верхнего уровня? - PullRequest
0 голосов
/ 24 июня 2019

Предположим, у меня есть следующее определение XSD (взято из FpML 5.11):

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="http://www.fpml.org/FpML-5/confirmation"
            targetNamespace="http://www.fpml.org/FpML-5/confirmation">
    <xsd:complexType name="CreditEventNoticeDocument">
        <xsd:sequence>
            <xsd:element name="eventContent" type="xsd:string"/>
            <xsd:element name="eventDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="creditEventNotice" type="CreditEventNoticeDocument"/>
    <xsd:complexType name="CreditEventNotice">
        <xsd:sequence>
            <xsd:element name="notifyingParty" type="xsd:string"/>
            <xsd:element name="noticeDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Предположим также, что я хотел бы использовать простое связывание XJC для генерации кода JAXB:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.1">
    <jaxb:globalBindings generateElementProperty="false">
        <jaxb:serializable/>
        <xjc:simple/>
    </jaxb:globalBindings>
</jaxb:bindings>

Обычно это приводит к тому, что объявление <xsd:element name="creditEventNotice" вступает в конфликт с <xsd:complexType name="CreditEventNotice">, и рекомендуемым способом решения этой проблемы является добавление привязки к одному из элементов.Я заметил, что, хотя я могу легко прикрепить настройку к элементу xsd:complexType, я бы предпочел вместо этого настроить xsd:element (поскольку, по логике, у него неправильное имя) - но я не могу найтиспособ прикрепить к нему настройку, чтобы он фактически приводил к безошибочной генерации XJC.Вот как я пытался это сделать:

<jaxb:bindings ...>
    <jaxb:globalBindings ... />
    <jaxb:bindings schemaLocation="./test.xsd" node="/xsd:schema">
        <jaxb:bindings node="xsd:element[@name='creditEventNotice']">
            <jaxb:class name="CreditEventNoticeDocument"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

Когда я использую jaxb:class, привязка распознается, но не имеет никакого эффекта - я все еще получаю ошибку Two declarations cause a collision in the ObjectFactory class..Когда вместо этого я использую jaxb:property, я получаю сообщение об ошибке compiler was unable to honor this property customization. It is attached to a wrong place, or its inconsistent with other bindings.

Итак, мой вопрос, как правильно настроить верхний уровень xsd:element?Возможно ли это вообще или я должен согласиться на переименование другого элемента, даже если это не имеет смысла семантически?

...