Pregunta

Al intentar generar clases desde un xsd, recibí este error:

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

Mi xsd define un elemento para agrupar un elemento ilimitado como este:

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

Y mi enlace de personalización sigue como se especifica en esta página , pero no funciona. Aquí mi encuadernación:

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

Mi intención es generar una clase individual para orderPropertyList, no el comportamiento predeterminado que genera una clase interna dentro del elemento raíz de xsd.

He visto a alguien con la misma intención aquí y aquí , pero no funciona correctamente para yo. :(

Versión JAXB:

Specification-Version: 2.1
Implementation-Version: 2.1.8

¿Alguna ayuda?

¿Fue útil?

Solución

Creo que lo que debes hacer está configurado:

<jaxb:globalBindings localScoping="toplevel"/>

Esto generará clases independientes en lugar de clases anidadas.

Haciendo

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

es un enlace redundante, ya que orderPropertyList se asignará de forma predeterminada a OrderPropertyList. El nombre del paquete incluye el nombre de la clase externa en el que está anidado de forma predeterminada, por lo que no lo está cambiando.

Además, si desea cambiar el nombre de la clase generada, creo que la XPath sería:

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

con complexType en el final. Creo que excluir esto fue lo que causó el mensaje de error que recibiste.

Otros consejos

Es realmente divertido cuando tienes un esquema como el siguiente:

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

En este caso, xjc parece estar intentando generar realmente cuatro clases llamadas Something , una para cada elemento llamado Something y una para cada uno de sus complexType s. Por lo tanto, debe proporcionar un enlace que afecte a cada uno de estos cuatro elementos y tipos complejos específicamente en el nivel en el que aparecen en el esquema (bueno, en realidad solo tres, porque entonces el cuarto solo puede convertirse en el único < código> Algo clase).

Creo que esto está sucediendo porque es probable que la clase Java generada represente la secuencia de " orderProperty " se llama a sí mismo " OrderPropertyList " ;.

Lo que haría es primero generarlo sin ningún enlace personalizado, y ver los nombres y jerarquías de clase que genera. Luego, considera lo que quieres anular y cómo.

Necesitaba hacer personalizaciones para un esquema como el que jeff303 presentó. Mi escenario fue ligeramente diferente en el sentido de que el esquema estaba dentro de un documento WSDL.

Una cosa señalada por philvarner es que la selección de nodo para el elemento debería terminar con '/ xs: complexType' y esto parecía muy importante, como lo haría el compilador continuamente genera una IllegalArgumentException relacionada con la herencia de bucle sin ella.

Estas publicaciones están relacionadas, por lo que me di cuenta de que un enlace de vuelta sería útil para alguien que "empiece a buscar en Google" y que termine aquí.

Echa un vistazo a la pregunta 7881883

Al ingresar este / xs: complexType al final del elemento, se ayudó a corregir el error de bucle de herencia de clase ilegal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top