tipo ejecutar descompilar como archivos archivo abrir java maven xsd jaxb

java - ejecutar - descompilar war



XJC: el compilador no pudo cumplir esta personalización de clase (2)

Agregaré otra respuesta ya que toma un tema diferente relacionado con la compilación de su esquema.

Lo que también noté es que estos dos tipos simples en realidad pertenecen a diferentes espacios de nombres. Entonces, en realidad, no deberían generarse en el mismo paquete en primer lugar.

Supongo que solo usa generatePackage para especificar org.isan como su paquete de destino. Entonces todos tus espacios de nombres terminan en un paquete que es bastante malo. JAXB funciona mejor si tiene un paquete por espacio de nombres. Se pondrá raro si no lo haces.

Por lo tanto, generalmente desaconsejo el uso de generatePackage , use jaxb:package lugar:

<bindings schemaLocation="http://www.isan.org/schema/v1.11/common/country.xsd"> <schemaBindings> <package name="org.isan.schema.v1_11.common.country"/> </schemaBindings> </bindings>

También recomendaría usar una versión de esquema mayor / menor con el nombre del paquete. Es posible que deba admitir varias versiones de esquema en paralelo más adelante.

Me gustaría llamar a ISAN Restful API desde mi proyecto de Java, así que estoy tratando de generar Java beans a partir de archivos xsd usando maven-jaxb2-plugin. Aquí están los xsds:

Descargué estos archivos y los copié en mi carpeta src / main / resources y definí un catálogo. Cuando construyo el proyecto, recibo un error porque dos tipos tienen el mismo nombre:

org.xml.sax.SAXParseExceptionpublicId: http://www.isan.org/schema/v1.11/common/language; systemId: http://www.isan.org/schema/v1.11/common/language.xsd; lineNumber: 39; columnNumber: 48; A class/interface with the same name "org.isan.CodingSystemType" is already in use. Use a class customization to resolve this conflict. org.xml.sax.SAXParseExceptionpublicId: http://www.isan.org/schema/v1.11/common/country; systemId: http://www.isan.org/schema/v1.11/common/country.xsd; lineNumber: 39; columnNumber: 48; (Relevant to above error) another "CodingSystemType" is generated from here.

Eso es correcto: language.xsd y country.xsd definen un tipo llamado CodingSystemType:

<xs:simpleType name="CodingSystemType"> <xs:restriction base="xs:string"> <xs:enumeration value="ISO639_2"/> <xs:enumeration value="RFC3066"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="CodingSystemType"> <xs:restriction base="xs:string"> <xs:enumeration value="ISO3166_1"/> </xs:restriction> </xs:simpleType>

Como se sugirió, traté de usar una personalización de clase para el tipo country.xsd. Agregué este enlace en pom.xml:

<bindings> <binding> <url>http://www.isan.org/schema/v1.11/common/country.xjb</url> </binding> </bindings>

El archivo xjc:

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net" xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"> <bindings schemaLocation="http://www.isan.org/schema/v1.11/common/country.xsd"> <bindings node="//xs:simpleType[@name=''CodingSystemType'']"> <class name="CountryCodingSystemType" /> </bindings> </bindings> </bindings>

Ahora, aparece otro error con el que no puedo tratar:

[ERROR] Error while parsing schema(s).Location [ http://www.isan.org/schema/v1.11/common/country.xjb{7,58}]. com.sun.istack.SAXParseException2; systemId: http://www.isan.org/schema/v1.11/common/country.xjb; lineNumber: 7; columnNumber: 58; compiler was unable to honor this class customization. It is attached to a wrong place, or its inconsistent with other bindings. [ERROR] Error while parsing schema(s).Location [ http://www.isan.org/schema/v1.11/common/country.xsd{39,48}]. com.sun.istack.SAXParseException2; systemId: http://www.isan.org/schema/v1.11/common/country.xsd; lineNumber: 39; columnNumber: 48; (the above customization is attached to the following location in the schema)


Tratar

<bindings node="//xs:simpleType[@name=''CodingSystemType'']"> <typesafeEnumClass name="CountryCodingSystemType" /> </bindings>

en lugar.

Creo que XJC hace una diferencia entre las enumeraciones de personalizaciones y las clases normales. Ver la pregunta relacionada: