XJB [ОШИБКА] Несколько ‹schemaBindings› определены для целевого пространства имен

У меня есть несколько файлов XSD, и я хочу запустить над ними XJC для создания объектов класса Java, которые я использую для дальнейшей обработки. ПРОБЛЕМА: 2 XSD из моего набора XSD имеют проблему при запуске команды XJC. XSD:

связаться с LM.xsd

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:w="http://w.com/xsd" 
            xmlns="http://w.com/location.contactlm" 
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
            targetNamespace="http://w.com/location.contactlm" 
            elementFormDefault="qualified" jaxb:version="2.1">
  <xsd:annotation>
    <xsd:appinfo>
      <jaxb:schemaBindings>
        <jaxb:package name="location.contactlm"/> 
      </jaxb:schemaBindings>
    </xsd:appinfo>
  </xsd:annotation>

  <xsd:element name="Contact" type="Contact" nillable="true"/>

  <xsd:complexType name="Contact">
    <xsd:sequence>
      <xsd:element name="RefID" type="xsd:string" nillable="true" 
                   minOccurs="0" gw:type="java.lang.String"/>
    </xsd:sequence>
  </xsd:complexType>


</xsd:schema>

связаться с M.xsd

<?xml version="1.0"?>
<xsd:schema
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:w="http://w.com/xsd"
      xmlns="http://w.com/location.contactm"
      targetNamespace="http://w.com/location.contactm"
      elementFormDefault="qualified"
      xmlns:ns0="http://w.com/location.contactam"
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"  
      jaxb:version="2.1">
  <xsd:annotation>
    <xsd:appinfo>
      <jaxb:schemaBindings>
        <jaxb:package name="location.contactm"/>
      </jaxb:schemaBindings>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:import namespace="http://w.com/location.contactam"
              schemaLocation="ContactAM.xsd"/>
  <xsd:element name="Contact" type="Contact" nillable="true"/>
  <xsd:complexType name="Contact">
    <xsd:sequence>
      <xsd:element name="RefID" minOccurs="0" nillable="true" 
                   type="xsd:string" gw:type="java.lang.String"/>
      <xsd:element name="WorkPhone" minOccurs="0" nillable="true" 
                   type="xsd:string" gw:type="java.lang.String"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Я знаю, что в этих файлах XSD есть ссылка на один и тот же «контакт», и это проблема. Итак, мне пришлось написать свой файл XJB. У меня есть следующий файл xjb:

<jaxb:bindings
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:gw="http://w.com/xsd" 
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified" 
  xmlns="http://w.com/location.contactlm" 

  targetNamespace="http://w.com/location.contactlm" 
  jaxb:version="2.1">

     <jaxb:bindings schemaLocation="ContactM.xsd">
        <jaxb:bindings node=".//xs:element[@name='Contact']">
            <jaxb:class name="ContactM"/>
        </jaxb:bindings>
        <jaxb:schemaBindings>
            <jaxb:package name="location.contactm" />
        </jaxb:schemaBindings>
    </jaxb:bindings>

   <jaxb:bindings schemaLocation="ContactLM.xsd">
        <jaxb:bindings node=".//xs:element[@name='Contact']">
            <jaxb:class name="ContactCLM"/>
        </jaxb:bindings>
        <jaxb:schemaBindings>
            <jaxb:package name="location.contactlm" />
        </jaxb:schemaBindings>
    </jaxb:bindings>

</jaxb:bindings>

но я получаю следующую ошибку, когда я это делаю:

xjc -d src -b C:\us\binding.xjb C:\us\trunk\shared\


parsing a schema...
346368376 / 346685920 (-1 / -1) (com/sun/tools/internal/xjc/reader/xmlschema/bindinfo/CollectionTypeAttribute$JaxbAccessorF_collectionType/com/sun/tools/internal/xjc/reader/xmlschema/bindinfo/CollectionTyp
eAttribute$JaxbAccessorF_collectionType)
[ERROR] Multiple <schemaBindings> are defined for the target namespace "http://w.com/location.contactm"
  line 10 of file:/C:/us/trunk/contact/ContactM.xsd

[ERROR] Another <schemaBindings> is defined here
  line 14 of file:/C:/us/trunk/contact/binding.xjb

[ERROR] Multiple <schemaBindings> are defined for the target namespace "http://w.com//trunk/contactlm"
  line 5 of file:/C:/us/trunk/contact/ContactLM.xsd

[ERROR] Another <schemaBindings> is defined here
  line 23 of file:/C:/us/trunk/contact/binding.xjb

[ERROR] compiler was unable to honor this schemaBinding customization. It is attached to a wrong place, or its inconsistent with other bindings.
  line 14 of file:/C:/us/trunk/contact/binding.xjb

[ERROR] (the above customization is attached to the following location in the schema)
  line 10 of file:/C:/us/trunk/contact/ContactM.xsd

[ERROR] compiler was unable to honor this schemaBinding customization. It is attached to a wrong place, or its inconsistent with other bindings.
  line 23 of file:/C:/us/trunk/contact/binding.xjb

[ERROR] (the above customization is attached to the following location in the schema)
  line 2 of file:/C:/us/trunk/contact/ContactLM.xsd

Failed to parse a schema.

Я предполагаю, что могу сделать что-то неправильно в файле XJB, но я не могу исправить проблему. Кто-нибудь, пожалуйста, помогите.


person VictorCreator    schedule 14.08.2013    source источник
comment
Ваши первые два сообщения об ошибке говорят о том, что Jaxb находит два элемента schemaBindings для каждого из двух ваших пространств имен — один в файле xjb и один в документе схемы XSD. Спросите себя (и спросите документацию, а в крайнем случае спросите компилятор JAXB): мне действительно нужно повторять это дважды? Или хватило бы одного раза?   -  person C. M. Sperberg-McQueen    schedule 14.08.2013
comment
@ C.M.Sperberg-McQueen Спасибо за ответ. Я был обеспокоен тем, почему никто даже не ответил! :-( Что касается того, мне нужны два документа схемы, да, потому что тот, который я написал в файле xjb, переопределяет документ схемы XSD. По крайней мере, это то, что я понял из чтения руководств. Пожалуйста, дайте мне знать, если это неправильный.   -  person VictorCreator    schedule 15.08.2013
comment
Меня другое беспокоит, неправильный ли мой файл XJB? Я составил свой файл xjb из всех знаний, которые смог собрать из различных источников в Интернете. Другими словами, это мешанина из разных источников. У меня есть ощущение, что что-то может быть не так в файле. У вас есть что сказать по этому поводу?   -  person VictorCreator    schedule 15.08.2013
comment
Я не эксперт JAXB; Могу дать только общий совет. Поэкспериментируйте с различными конфигурациями. Сначала сделайте простейший тестовый пример, который выдает это сообщение об ошибке. (Как только вы поймете проблему, исправить вашу реальную настройку будет легко.) Ваша задача — исправить ошибку; работайте так же систематически, как если бы вы работали над ошибкой в ​​Java. JaxB видит конфликт; попробуй найти и решить. Попробуйте подавить встроенную аннотацию, а затем внешнюю аннотацию; JaxB тогда счастлив? Подавить элемент jaxb:package (встроенный или внешний); затем подавить jaxb:schemaBindings. Удачи.   -  person C. M. Sperberg-McQueen    schedule 15.08.2013


Ответы (1)


В основном вам нужно удалить привязку схемы из файлов xsd. Я скопировал и проверил ваши файлы, и это сработало. Однако я изменил ссылку с ContactAM на ContactLM, предполагая, что это опечатка.

Вот мои файлы:

КонтактыM.xsd

<?xml version="1.0"?>
<xsd:schema
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:gw="http://w.com/xsd"
      xmlns="http://w.com/location.contactm"
      targetNamespace="http://w.com/location.contactm"
      elementFormDefault="qualified"
      xmlns:ns0="http://w.com/location.contactam"
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"  
      jaxb:version="2.1">
  <xsd:annotation>
    <xsd:appinfo>
<!--       <jaxb:schemaBindings> -->
<!--         <jaxb:package name="location.contactm"/> -->
<!--       </jaxb:schemaBindings> -->
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:import namespace="http://w.com/location.contactlm"
              schemaLocation="ContactLM.xsd"/>
  <xsd:element name="Contact" type="Contact" nillable="true"/>
  <xsd:complexType name="Contact">
    <xsd:sequence>
      <xsd:element name="RefID" minOccurs="0" nillable="true" 
                   type="xsd:string" gw:type="java.lang.String"/>
      <xsd:element name="WorkPhone" minOccurs="0" nillable="true" 
                   type="xsd:string" gw:type="java.lang.String"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

КонтактыLM.xsd

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:gw="http://w.com/xsd" 
            xmlns="http://w.com/location.contactlm" 
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
            targetNamespace="http://w.com/location.contactlm" 
            elementFormDefault="qualified" jaxb:version="2.1">
  <xsd:annotation>
    <xsd:appinfo>
<!--       <jaxb:schemaBindings> -->
<!--         <jaxb:package name="location.contactm"/> -->
<!--       </jaxb:schemaBindings> -->
    </xsd:appinfo>
  </xsd:annotation>

  <xsd:element name="Contact" type="Contact" nillable="true"/>

  <xsd:complexType name="Contact">
    <xsd:sequence>
      <xsd:element name="RefID" type="xsd:string" nillable="true" 
                   minOccurs="0" gw:type="java.lang.String"/>
    </xsd:sequence>
  </xsd:complexType>


</xsd:schema>

и, наконец, файл привязки:

привязка.xjb

<jaxb:bindings
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:gw="http://w.com/xsd" 
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified" 
  xmlns="http://w.com/location.contactlm" 

  targetNamespace="http://w.com/location.contactlm" 
  jaxb:version="2.1">

     <jaxb:bindings schemaLocation="ContactM.xsd">
        <jaxb:bindings node=".//xs:element[@name='Contact']">
            <jaxb:class name="ContactM"/>
        </jaxb:bindings>
        <jaxb:schemaBindings>
            <jaxb:package name="location.contactm" />
        </jaxb:schemaBindings>
    </jaxb:bindings>

   <jaxb:bindings schemaLocation="ContactLM.xsd">
        <jaxb:bindings node=".//xs:element[@name='Contact']">
            <jaxb:class name="ContactCLM"/>
        </jaxb:bindings>
        <jaxb:schemaBindings>
            <jaxb:package name="location.contactlm" />
        </jaxb:schemaBindings>
    </jaxb:bindings>

</jaxb:bindings>

И для полноты вот моя команда и ее вывод

D:\stackoverflow\sample>xjc ContactM.xsd -b bind.xjb
parsing a schema...
compiling a schema...
location\contactm\Contact.java
location\contactm\ContactM.java
location\contactm\ObjectFactory.java
location\contactm\package-info.java
location\contactlm\Contact.java
location\contactlm\ContactCLM.java
location\contactlm\ObjectFactory.java
location\contactlm\package-info.java

Надеюсь это поможет.

person W Almir    schedule 29.08.2013
comment
Большое спасибо за помощь. :-) - person VictorCreator; 07.09.2013
comment
У меня есть набор файлов, которые мне не разрешено редактировать, файлы xsd, и файл имеет targetNamespace=namespace1, а затем импортирует namespace=namespace2. Знаете ли вы, как исправить это, не изменяя файл xsd? - person cody.tv.weber; 22.08.2019