Вопрос

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

Какая-нибудь помощь?

Это было полезно?

Решение

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

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

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

Другие советы

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

<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, и по одному для каждого из их complexTypes.Итак, вам нужно предоставить привязку, которая затрагивает каждый из этих четырех элементов и сложные типы конкретно на том уровне, где они встречаются в схеме (ну, на самом деле только три, потому что тогда 4-й может просто стать единственным Something класс).

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top