Настройка привязки JAXB

При попытке создать классы из xsd я получил эту ошибку:

java.lang.IllegalArgumentException: Illegal class inheritance loop.  Outer class OrderPropertyList may not subclass from inner class: OrderPropertyList

Мой xsd определяет элемент для группировки неограниченного элемента следующим образом:

  <element minOccurs="0" name="orderPropertyList">
    <complexType>
      <sequence>
        <element maxOccurs="unbounded" name="orderProperty" type="tns:orderProperty" />
      </sequence>
    </complexType>
  </element>

И моя привязка настройки выполняется так, как указано на этой странице , но это не работает. Вот моя привязка:

<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
    <jaxb:bindings node="//xs:element[@name='orderPropertyList']">
        <jaxb:class name="OrderPropertyList"/>
    </jaxb:bindings>
</jaxb:bindings>

Мое намерение состоит в том, чтобы создать отдельный класс для orderPropertyList, а не поведение по умолчанию, которое создает внутренний класс внутри корневого элемента xsd.

Я наблюдал за человеком с таким же намерением здесь и здесь, но у меня это не работает должным образом. :(

JAXB-версия:

Specification-Version: 2.1
Implementation-Version: 2.1.8

Любая помощь?


person paulosuzart    schedule 27.09.2008    source источник
comment
Это какая-то ужасная ситуация, как всегда генерировать классы без использования внутренних классов? О Боже! Если вы используете Weblogic 10 с jax-ws, у вас не может быть внутренних классов внутри ваших типов запроса/ответа. Грустный!   -  person paulosuzart    schedule 28.09.2008


Ответы (5)


Я считаю, что вам нужно установить:

<jaxb:globalBindings localScoping="toplevel"/>

Это создаст автономные классы вместо вложенных классов.

Делает

<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
    <jaxb:bindings node="//xs:element[@name='orderPropertyList']">
            <jaxb:class name="OrderPropertyList"/>
    </jaxb:bindings>
</jaxb:bindings>

является избыточной привязкой, поскольку по умолчанию orderPropertyList будет отображаться в OrderPropertyList. Имя пакета включает в себя имя внешнего класса, в который он вложен по умолчанию, поэтому вы его не меняете.

Кроме того, если вы хотите изменить имя сгенерированного класса, я думаю, что XPath на самом деле будет:

<jaxb:bindings node="//xs:element[@name='orderPropertyList']/xs:complexType">

со сложным типом на конце. Я думаю, что исключение этого было причиной сообщения об ошибке, которое вы получили.

person Community    schedule 07.10.2008
comment
Без эффекта! Я пытался использовать верхний уровень и множество комбинаций для выражения xPath. Когда я использую localScoping верхнего уровня, я получаю: [xjc] [ERROR] Класс/интерфейс с тем же именем order.OrderLineList уже используется. Используйте настройку класса, чтобы разрешить этот конфликт. - person paulosuzart; 09.10.2008
comment
После переопределения всех определений с одинаковым именем, одно за другим, это сработало! Урф! Много работы, включающей более 15 xsd для создания классов и разрешения конфликтов... Спасибо! - person paulosuzart; 14.10.2008

Это действительно весело, когда у вас есть схема, подобная следующей:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
    <xsd:element name="TopLevelElement">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Something">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="Something" maxOccurs="unbounded">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="somethingFieldA" type="xsd:string"/>
                                        <xsd:element name="somethingFieldB" type="xsd:string"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

В этом случае xjc, похоже, пытается сгенерировать четыре класса с именами Something, по одному для каждого элемента с именем Something и по одному для каждого из их complexType. Таким образом, вам необходимо обеспечить привязку, которая обращается к каждому из этих четырех элементов и сложных типов именно на том уровне, где они встречаются в схеме (на самом деле только три, потому что тогда 4-й может просто стать единственным Something класс).

person Jeff Evans    schedule 15.10.2011

Я считаю, что это происходит потому, что сгенерированный класс Java, представляющий последовательность «orderProperty», сам, вероятно, называется «OrderPropertyList».

Я бы сначала сгенерировал его без каких-либо пользовательских привязок и посмотрел на имена классов и иерархии, которые он генерирует. Затем подумайте, что вы хотите переопределить и как.

person David M. Karr    schedule 27.09.2008
comment
На самом деле, когда я удаляю привязку, у меня поведение по умолчанию: OrderPropertyList как внутренний класс корневого элемента. Я использую пользовательскую привязку, чтобы избежать (даже безуспешно) этой ситуации. - person paulosuzart; 27.09.2008

Мне нужно было настроить схему, подобную представленной jeff303. Мой сценарий немного отличался тем, что схема была встроена в документ WSDL.

Одна вещь, на которую указал philvarner, заключается в том, что выбор узла для элемента должен заканчиваться '/xs:complexType', и это кажется очень важным, поскольку компилятор будет постоянно генерировать IllegalArgumentException, связанный с зацикливанием наследования без него.

Эти посты связаны между собой, поэтому я подумал, что обратная ссылка будет полезна для тех, кто «погуглит» и попадет сюда.

Проверьте вопрос 7881883

person dolbysurnd    schedule 25.10.2011

Ввод этого /xs:complexType в конце элемента помог исправить ошибку цикла незаконного наследования классов.

person amit dahiya    schedule 23.11.2015