Domanda

Durante il tentativo di generare classi da un xsd, ho riscontrato questo errore:

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

Il mio xsd definisce un elemento per raggruppare un elemento illimitato come questo:

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

E la mia associazione di personalizzazione segue come specificato su questa pagina , ma non funziona. Ecco il mio legame:

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

La mia intenzione è di generare una singola classe per orderPropertyList, non il comportamento predefinito che sta generando una classe interna all'interno dell'elemento root di xsd.

Ho visto qualcuno con la stessa intenzione qui e qui , ma non funziona correttamente per me. : (

Versione JAXB:

Specification-Version: 2.1
Implementation-Version: 2.1.8

Qualche aiuto?

È stato utile?

Soluzione

Credo che sia necessario ciò che devi fare:

<jaxb:globalBindings localScoping="toplevel"/>

Ciò genererà classi autonome anziché classi nidificate.

Fare

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

è un'associazione ridondante, poiché orderPropertyList verrà mappato per impostazione predefinita su OrderPropertyList. Il nome del pacchetto include il nome della classe esterna in cui è nidificato per impostazione predefinita, quindi non lo cambi.

Inoltre, se volessi cambiare il nome della classe generata, penso che XPath sarebbe effettivamente:

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

con complexType alla fine. Penso che escludendo questo sia stato ciò che ha causato il messaggio di errore che hai ricevuto.

Altri suggerimenti

È davvero divertente quando hai uno schema come il seguente:

<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 questo caso, xjc sembra tentare effettivamente di generare quattro classi chiamate Something , una per ogni elemento chiamato Something e una per ciascuno dei loro complexType s. Quindi è necessario fornire un'associazione che colpisca ciascuno di questi quattro elementi e tipi complessi in modo specifico al livello in cui si verificano nello schema (beh, in realtà solo tre, perché quindi il 4 ° può diventare solo < code> Something class).

Credo che ciò accada perché è probabile che la classe Java generata rappresenti la sequenza di "orderProperty" è esso stesso denominato " OrderPropertyList " ;.

Quello che vorrei fare è prima generarlo senza alcun bind personalizzato e guardare i nomi delle classi e le gerarchie che genera. Quindi, considera cosa vuoi sovrascrivere e come.

Avevo bisogno di fare personalizzazioni per uno schema come quello jeff303 presentato. Il mio scenario era leggermente diverso in quanto lo schema era incorporato in un documento WSDL.

Una cosa sottolineata da philvarner è che la selezione del nodo per l'elemento dovrebbe terminare con '/ xs: complexType' e questo sembra molto importante, come farebbe il compilatore generare continuamente un'eccezione IllegalArgumentException relativa al ciclo ereditario senza di essa.

Questi post sono correlati, quindi ho pensato che un link indietro sarebbe stato utile per qualcuno che "googling" finisce qui.

Consulta la domanda 7881883

L'immissione di questo / xs: complexType alla fine dell'elemento ha aiutato a correggere l'errore del ciclo di ereditarietà della classe illegale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top