Вопрос
При попытке сгенерировать классы из 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
, и по одному для каждого из их complexType
s.Итак, вам нужно предоставить привязку, которая затрагивает каждый из этих четырех элементов и сложные типы конкретно на том уровне, где они встречаются в схеме (ну, на самом деле только три, потому что тогда 4-й может просто стать единственным Something
класс).
Я полагаю, что это происходит потому, что, вероятно, сгенерированный Java-класс, представляющий последовательность "orderProperty", сам называется "OrderPropertyList".
Что я бы сделал, так это сначала сгенерировал его без каких-либо пользовательских привязок и посмотрел на имена классов и иерархии, которые он генерирует.Затем подумайте, что вы хотите переопределить и как.
Мне нужно было выполнить настройки для схемы, подобной этой джефф303 представленный.Мой сценарий немного отличался тем, что схема была встроена в документ WSDL.
Одна вещь, на которую указал филварнер это тот самый выбор узла для элемента должен заканчиваться на '/xs:complexType' и это казалось очень важным, поскольку без этого компилятор постоянно генерировал бы исключение IllegalArgumentException, связанное с циклическим наследованием.
Эти посты связаны, поэтому я подумал, что обратная ссылка была бы полезна тому, кто "погуглит", что попадет сюда.
Проверьте вопрос 7881883
Вводя это /xs:complexType
в конце элемент помог в исправлении ошибки недопустимого цикла наследования класса.