Как использовать привязку схемы JAXB для изменения имени элемента схемы - PullRequest
0 голосов
/ 26 апреля 2020

Я работаю над проектом JAXB / SOAP и обнаружил ошибку «Два глобальных компонента не могут иметь одинаковое имя» в моих файлах схемы XSD. Я пытался использовать внешние привязки и привязки схемы, как предлагалось в других публикациях, но не смог заставить их работать. Это должно быть что-то простое, что я просто скучаю, но я перепробовал все, что могу придумать, но безуспешно. Любая помощь будет оценена. Вот что я делаю:

Может быть несколько запросов / ответов на SOAP пространство имен службы / цели, и у каждого есть свой собственный файл схемы. Я хочу, чтобы их классы были в одном пакете Java, поэтому я использовал привязку схемы, чтобы назначить желаемое имя пакета. Но XJ C допускает только одну такую ​​привязку для целевого пространства имен (т. Е. Несколько файлов не могут иметь одинаковую привязку), поэтому я создал «основной» xsd, включающий все остальные файлы xsd. Первый содержит привязку схемы для имени пакета для всех запросов / ответов в этом пространстве имен. Это работало нормально, пока я не добавил запрос, который содержал поля с тем же именем, что и другой запрос, из-за чего появилась ошибка, упомянутая выше.

Основываясь на предложениях и примерах, найденных в других местах, я сначала попробовал привязку схемы во вновь добавленном xsd, потому что я предпочел бы привязки в том же файле, что и элементы, к которым они относятся. Это не сработало, поэтому я попробовал внешнее связывание в 'bindings.xjb', и это тоже не сработало. Я думаю, что в XPATH может быть что-то не так с элементом, который я хочу изменить, но если это так, я не вижу этого. Вот файлы:

Master XSD, расположенный в src / main / xsd / service1 / Service1.xsd, вместе со всеми остальными включенными схемами:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetamespace="http://services.myco.com/service1"
    xmlns:service1="http://services.myco.com/service1"
    elementFormDefault="qualified"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="2.1" >

    <xs:include schemaLocation="AuthenticationHeader.xsd"/>
    <xs:include schemaLocation="Request1.xsd"/>
    <xs:include schemaLocation="Response1.xsd"/>
    <xs:include schemaLocation="Request2.xsd"/>

</xs:schema>

Auth header XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://services.myco.com/service1"
    xmlns:service1="http://services.myco.com/service1"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="2.1" >

    <xs:annotation>
    <xs:appinfo>
        <jaxb:schemaBindings >
            <jaxb:package name="com.myco.soap.api.service1"/>
        </jaxb:schemaBindings>
    </xs:appinfo>
    </xs:annotation>

    <xs:element name="AuthenticationHeader">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="service1:Username"/>
                <xs:element ref="service1:Password"/>
                <xs:element ref="service1:DataSource"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Username" type="xs:string"/>
    <xs:element name="Password" type="xs:string"/>
    <xs:element name="DataSource" type="xs:string"/>
</xs:schema>

Request1 XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://services.myco.com/service1"
    xmlns:operator="http://services.myco.com/service1"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="2.0" >

    <xs:element name="Request1">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="service1:customerName" minOccurs="0"/>
                <xs:element ref="service1:customerId" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="customerName" type="xs:string"/>
    <xs:element name="customerId" type="xs:integer"/>

</xs:schema>

Response1 XSD опущен для краткости

Request2 XSD с показом нерабочей привязки схемы

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://services.myco.com/service1"
    xmlns:operator="http://services.myco.com/service1"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:version="2.1" >

    <xs:annotation>
    <xs:appinfo>
        <jaxb:schemaBindings>
            <jaxb:bindings node="//xs:element[@name='customerName']">
                <property name="customerNameRq2"/>
            </jaxb:bindings>
        </jaxb:schemaBindings>
    </xs:appinfo>
    </xs:annotation>

    <xs:element name="Request2">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="service1:customerName"/>
                <xs:element ref="service1:customerId"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="customerName" type="xs:string"/>
    <xs:element name="customerId" type="xs:integer"/>
</xs:schema>

Внешние привязки XJB расположены в src / main / xjb / bindings.xjb

<jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jaxb:bindings schemaLocation="../xsd/service1/Request2.xsd" node="/xs:schema">
        <jaxb:schemaBindings>
            <jaxb:bindings node="//xs:element[@name='customerName']">
                <property name="customerNameRq2"/>
            </jaxb:bindings>
        </jaxb:schemaBindings>
    </jaxb:bindings>

</jaxb:bindings>

Заранее благодарен за любую помощь.

...