ws3 what versiones ultima school creador and xml xsd jaxb

what - xml versiones



JAXB Binding Customization (5)

Al intentar generar clases desde un xsd, obtuve 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 enlace:

<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 bien para mí. :(

Versión JAXB:

Specification-Version: 2.1 Implementation-Version: 2.1.8

¿Alguna ayuda?


Creo que esto está sucediendo porque es probable que la clase Java generada que representa la secuencia de "orderProperty" se llame a sí misma "OrderPropertyList".

Lo que haría sería generarlo primero sin ningún enlace personalizado, y mirar los nombres de clase y las jerarquías que genera. Luego, considere lo que desea anular y cómo.


Creo que lo que necesita hacer es establecer:

<jaxb:globalBindings localScoping="toplevel"/>

Esto generará clases independientes en lugar de clases anidadas.

Obra

<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 mapeará por defecto a OrderPropertyList. El nombre del paquete incluye el nombre de clase externo en el que está anidado de manera predeterminada, por lo que no está cambiando eso.

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

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

con complexType al final. Creo que excluir esto fue lo que estaba causando el mensaje de error que recibiste.


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 otra para cada uno de sus complexType . Por lo tanto, debe proporcionar un enlace que coincida con cada uno de estos cuatro elementos y tipos complejos específicamente en el nivel en el que aparecen en el esquema (realmente solo tres, porque entonces el 4 puede convertirse en la clase de Something solitario).


Ingresar this /xs:complexType al final del elemento ayudó a corregir el error de bucle de herencia de clase ilegal.


Necesitaba hacer personalizaciones para un esquema como el presentado en jeff303 . Mi escenario era ligeramente diferente porque el esquema estaba incluido en un documento WSDL.

Una cosa señalada por philvarner es que la selección de nodos para el elemento debería terminar con ''/ xs: complexType'' y esto parecía muy importante, ya que el compilador generaría continuamente una IllegalArgumentException relacionada con la herencia de bucle sin él.

Estas publicaciones están relacionadas, así que pensé que un enlace de vuelta sería útil para alguien ''googleando'' que termina aquí.

Mira la pregunta 7881883