Я работаю над проектом 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>
Заранее благодарен за любую помощь.