Frage

Beim Versuch Klassen aus einem XSD zu erzeugen, ich habe diesen Fehler:

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

Meine xsd ein Element der Gruppe wie folgt ein unbeschränktes Element definieren:

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

Und meine Anpassung Bindung folgt, wie auf dieser Seite , aber es nicht funktioniert. Hier ist meine Bindung:

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

Meine Absicht ist es, eine individuelle Klasse für orderPropertyList zu erzeugen, nicht der Standard verhalten, dass eine innere Klasse innerhalb des Wurzelelementes des XSD generiert.

Ive beobachtete jemand mit der gleichen Absicht hier und hier , aber es spielt keine richtig für mich arbeiten. : (

JAXB Version:

Specification-Version: 2.1
Implementation-Version: 2.1.8

Jede Hilfe?

War es hilfreich?

Lösung

Ich glaube, was Sie brauchen, um zu festgelegt ist:

<jaxb:globalBindings localScoping="toplevel"/>

Dies wird eigenständige Klassen anstelle von verschachtelten Klassen erzeugen.

Sie

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

ist ein redundantes Bindung, da orderPropertyList standardmäßig OrderPropertyList abbildet. Der Name des Pakets enthält die äußereen Klassennamen es standardmäßig in verschachtelt ist, so dass Sie nicht, dass zu ändern.

Auch wenn Sie den Namen der generierten Klasse ändern wollen, ich denke, die XPath würde eigentlich sein:

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

mit complex am Ende. Ich denke, ohne das war, was die Fehlermeldung verursacht wurde Sie.

Andere Tipps

Es ist wirklich Spaß, wenn Sie ein Schema wie die folgenden haben:

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

In diesem Fall scheint xjc zu versuchen, tatsächlich vier Klassen erzeugen Something genannt, einen für jedes Element mit dem Namen Something und einen für jeden ihrer complexTypes. Sie müssen also eine Bindung zu schaffen, die jeden dieser vier Elemente trifft und komplexe Typen speziell auf der Ebene, wo sie im Schema auftreten (auch wirklich nur drei, weil dann die vierte werden nur die einsame Something Klasse).

Ich glaube, dass dies geschieht, weil es wahrscheinlich ist, dass die erzeugte Java-Klasse, die die Folge von „orderProperty“ selbst „OrderPropertyList“ genannt.

Was ich tun würde, ist es zuerst generieren ohne individuelle Bindungen, und schauen Sie sich die Klassennamen und Hierarchien, die es erzeugt. Dann überlegen, was Sie außer Kraft setzen wollen, und wie.

Ich brauchte Anpassungen für ein Schema wie das zu tun, jeff303 dargestellt. Mein Szenario war etwas anders, dass das Schema wurde in einem WSDL-Dokument inlined.

Eine Sache, wies darauf hin, von philvarner ist, dass die Knotenauswahl für das Element sollte am Ende mit ‚/ xs: complex‘ und dies schien sehr wichtig, da der Compiler würde kontinuierlich eine Illegal erzeugen, ohne es zu Looping Vererbung verwendet.

Diese Kommentare, damit ich ein Link zurück dachte wäre hilfreich, jemand ‚googeln‘, die hier endet.

Sehen Sie sich Frage 7.881.883

Die Eingabe dieses /xs:complexType am Ende des Elements dazu beigetragen, die illegal Klassenvererbung Schleifenfehler bei der Festsetzung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top