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

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

4 голосов
/ 27 сентября 2008

При попытке создать классы из 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

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

Ответы [ 5 ]

13 голосов
/ 07 октября 2008

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

<jaxb:globalBindings localScoping="toplevel"/>

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

Doing

<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">

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

2 голосов
/ 15 октября 2011

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

<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 класс).

0 голосов
/ 23 ноября 2015

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

0 голосов
/ 25 октября 2011

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

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

Эти посты связаны между собой, поэтому я подумал, что обратная ссылка будет полезна для кого-то, кто "гуглит", который здесь заканчивается.

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

0 голосов
/ 27 сентября 2008

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

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

...