Question

En essayant de générer des classes à partir d'un xsd, j'ai eu cette erreur:

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

Mon xsd définit un élément pour regrouper un élément non lié comme ceci:

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

Et ma liaison de personnalisation suit comme indiqué dans la cette page , mais ça ne marche pas. Voici ma reliure:

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

Mon intention est de générer une classe individuelle pour orderPropertyList, et non le comportement par défaut qui génère une classe interne à l'intérieur de l'élément racine du xsd.

J'ai vu quelqu'un de même intention ici et ici , mais cela ne fonctionne pas correctement pour moi. : (

Version JAXB:

Specification-Version: 2.1
Implementation-Version: 2.1.8

Avez-vous de l'aide?

Était-ce utile?

La solution

Je crois que ce que vous devez faire est défini:

<jaxb:globalBindings localScoping="toplevel"/>

Ceci générera des classes autonomes au lieu des classes imbriquées.

Faire

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

est une liaison redondante, puisque orderPropertyList mappera par défaut à OrderPropertyList. Le nom du paquet inclut le nom de la classe externe dans laquelle il est imbriqué par défaut. Par conséquent, vous ne le modifiez pas.

En outre, si vous souhaitez modifier le nom de la classe générée, je pense que XPath serait en réalité:

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

avec complexType à la fin. Je pense que l'exclusion de ce qui était à l'origine du message d'erreur que vous avez eu.

Autres conseils

C'est vraiment amusant quand vous avez un schéma comme celui-ci:

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

Dans ce cas, xjc semble essayer de générer quatre classes appelées quelque chose , une pour chaque élément nommé quelque chose et une pour chacun de leurs . complexType s. Vous devez donc fournir une liaison qui touche chacun de ces quatre éléments et complexes, en particulier au niveau où ils apparaissent dans le schéma (enfin, seulement trois, car le quatrième peut devenir le seul code> quelque chose classe).

Je pense que cela se produit car il est probable que la classe Java générée représentant la séquence de "orderProperty" est elle-même nommée "OrderPropertyList".

Ce que je ferais, c’est d’abord de le générer sans aucune liaison personnalisée et d’examiner les noms de classe et les hiérarchies qu’il génère. Ensuite, réfléchissez à ce que vous souhaitez remplacer et comment.

Je devais effectuer des personnalisations pour un schéma tel que celui présenté jeff303 . Mon scénario était légèrement différent en ce sens que le schéma était intégré dans un document WSDL.

philvarner a souligné que la sélection du noeud pour l'élément devait se terminer par "/ xs: complexType" et que cela semblait très important, comme le compilateur le ferait. générez continuellement une exception IllegalArgumentException liée à l'héritage en boucle sans celui-ci.

Ces messages sont liés, alors j'ai pensé qu'un lien en retour serait utile pour quelqu'un qui "google" et qui se termine ici.

Consultez la question 7881883

La saisie de ce / xs: complexType à la fin de l'élément a permis de corriger l'erreur de boucle d'héritage de classe illégale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top