2008-09-27 3 views
4

При попытке создания классов из XSD, я получил эту ошибку:JAXB Связывание Customization

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> 

И мой настройки привязка следует, как указано на this page, но она не работает. Вот мой привязки:

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

Я наблюдал за кем-то с тем же намерением here и here, но он не работает должным образом для меня. :(

JAXB версия:

Specification-Version: 2.1 
Implementation-Version: 2.1.8 

Любая помощь

+0

Это своего рода ужасная ситуация, как всегда генерировать классы без использования внутренних классов? О Боже! Если вы используете Weblogic 10 с jax-ws, вы не можете иметь внутренние классы внутри типов запросов/ответов. Грустный! – paulosuzart 2008-09-28 02:55:41

ответ

12

Я считаю, что вам нужно, чтобы устанавливается:

<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 на конце. Я думаю, что исключение этого было причиной того, что вы получили сообщение об ошибке.

+0

Без эффекта! Я пытался использовать toplevel и много комбинаций для выражения xPath. Когда я использую toplevel localScoping, я получаю: [xjc] [ERROR] Класс/интерфейс с тем же именем «order.OrderLineList» уже используется. Используйте настройку класса для разрешения конфликта . – paulosuzart 2008-10-09 16:43:04

0

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

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

+0

Фактически, когда я удаляю привязку, у меня есть поведение по умолчанию: OrderPropertyList как внутренний класс корневого элемента. Из этой ситуации я использую пользовательскую привязку к scape (даже без успеха). – paulosuzart 2008-09-27 18:16:45

2

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

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

0

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

Одно указывали philvarner является то, что выбор по узлу для элемента должен заканчиваться «/ хз: ComplexType» и это казалось очень важным, так как компилятор будет постоянно генерировать IllegalArgumentException, связанный с зацикливанием наследования без Это.

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

Заканчивать вопрос 7881883

0

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