java - tipo - jaxb tutorial
Generando clases Java fuera de XMLSchema.xsd usando JAXB (8)
Encontré el mismo error y eliminé <generatePackage></generatePackage>
completo. Esto resolvió mi problema.
Estoy usando jaxb para generar clases java de un esquema xml. El esquema importa XMLSchema.xsd y su contenido se utiliza como un elemento en el documento.
Si elimino la importación y la referencia a "xsd: schema" respectivamente, entonces el compilador de enlace genera con éxito las clases. Si no lo hago, se producirían los siguientes errores, que son los mismos si se intentara generar clases Java desde XMLSchema.xsd solamente
> C:/Users/me>"%JAXB%/xjc" -extension -d tmp/uisocketdesc -p uis.jaxb uisocketdesc.xsd -b xml_binding_test.xml -b xml_binding_test_2.xml
-b xml_binding_test_3.xml
parsing a schema...
compiling a schema...
> [ERROR] A class/interface with the same name "uis.jaxb.ComplexType" is already in use. Use a class customization to resolve this conflict.
line 612 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "ComplexType" is generated from here.
line 440 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Attribute" is already in use. Use a class customization to resolve this conflict.
line 364 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Attribute" is generated from here.
line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.SimpleType" is already in use. Use a class customization to resolve this conflict.
line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "SimpleType" is generated from here.
line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Group" is already in use. Use a class customization to resolve this conflict.
line 930 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Group" is generated from here.
line 727 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.AttributeGroup" is already in use. Use a class customization to resolve this conflict.
line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "AttributeGroup" is generated from here.
line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Element" is already in use. Use a class customization to resolve this conflict.
line 721 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Element" is generated from here.
line 647 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 364 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 930 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 727 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 440 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 612 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 647 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 721 of "http://www.w3.org/2001/XMLSchema.xsd"
Failed to produce code.
Experimenté el mismo problema al generar objetos desde .wsdl usando cxf. La resolución para mí es usar -autoNameResolution como sugiere un mensaje de error. Configuración de Maven:
<wsdlOption>
<wsdl>${basedir}/test.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
<packagenames>
<packagename>test.wsdl</packagename>
</packagenames>
</wsdlOption>
Intenté seguirlo y me funcionó:
<jxb:bindings schemaLocation="ClaimActivity-ACORD.xsd">
<jxb:schemaBindings>
<jxb:package name="x.x.x.x" />
</jxb:schemaBindings>
<jxb:bindings node="//xsd:complexType[@name=''ConstructionType'']">
<jxb:class name="AbstractConstructionType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name=''ItemDefinitionType'']">
<jxb:class name="AbstractItemDefinitionType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name=''LocationType'']">
<jxb:class name="AbstractLocationType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name=''TaxFeeType'']">
<jxb:class name="AbstractTaxFeeType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name=''DeductibleType'']">
<jxb:class name="AbstractDeductibleType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name=''RegistrationType'']">
<jxb:class name="AbstractRegistrationType" />
</jxb:bindings>
</jxb:bindings>
Luchando contra esas cosas también, para mí es un tema que distingue entre mayúsculas y minúsculas y el mismo nombre para la cuestión de elementos y atributos (a veces a través de la herencia). Para el segundo problema, estoy usando un archivo de enlace externo que contiene algo como esto:
<jaxb:bindings node="//xs:complexType[@name=''AbstractGriddedSurfaceType'']//xs:attribute[@name=''rows'']">
<jaxb:property name="rowCount"/>
</jaxb:bindings>
Para problemas de sensibilidad de mayúsculas y minúsculas, puede utilizar el argumento xjc -XautoNameResolution , la versión de maven es <args><arg>-B-XautoNameResolution</arg></args>
, pero esto no funciona para elementos de envoltura, por lo que para estos necesita para escribir las personalizaciones jaxb como se mencionó anteriormente, ... y si no tiene suerte como yo :) es posible que necesite utilizar una copia local de un xsd y corregir las duplicaciones manualmente.
Editar Encontró otra solución para el problema de la distinción entre mayúsculas y minúsculas, donde cambiar el nombre del elemento no es suficiente:
<jaxb:bindings node=".//xs:element[@name=''imageDatum''][@type=''gml:ImageDatumPropertyType'']">
<jaxb:property name="imageDatumInst"/>
<jaxb:factoryMethod name="imageDatumInst" />
</jaxb:bindings>
Buena suerte, espero que esto sirva.
Otra opción sería eliminar la opción -p para que las clases se generen en diferentes paquetes.
Parece que tu esquema está roto XJC es extremadamente exigente con estas cosas y puede fallar en cosas que otras herramientas dejan pasar.
En lugar de repasar los errores de XJC, primero me resulta más fácil ejecutar el esquema a través del verificador de calidad de esquemas AlphaWorks . Esto da una salida agradable, legible por el ser humano (bueno, legible por el desarrollador, de todos modos) de lo que está mal. Si supera ese OK, tendrá muchas más posibilidades de que también pase por XJC.
Puede obtener JAXB para generar código para el esquema XML xsd mediante (al menos) dos métodos. El problema que está experimentando se debe al hecho de que algunos tipos de esquema y elementos comparten los mismos nombres.
La primera opción evita conflictos de nombres aplicando una o más transformaciones de nombres XML a los nombres de clase generados. Aquí hay un ejemplo de un archivo de enlace externo que hará esto:
<jxb:bindings version="2.1"
xmlns:jxb="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"
jxb:extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="XMLSchema.xsd">
<jxb:schemaBindings>
<jxb:nameXmlTransform>
<jxb:elementName suffix="Element"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
Este enfoque funciona (podría aplicar otras transformaciones que funcionen igual de bien, pero he visto esta técnica una y otra vez en la documentación) pero creo que produce resultados feos. Por ejemplo, hay una clase generada en este caso llamada ElementElement
.
El segundo enfoque utiliza la personalización de clase como lo sugiere la salida de xjc. De hecho, todas las clases de problemas menos una tienen la propiedad abstract="true"
establecida en el tipo de esquema correspondiente. Por lo tanto, para mí tiene sentido anteponer el nombre de la clase con "Abstract", es decir, AbstractElement
. La clase de Attribute
restante no es abstracta, pero el attribute
xs:element
named genera una clase de extensión con un cuerpo vacío. Por eso lo llamé BaseAttribute
. Aquí está la definición de enlace externo que utilicé:
<jxb:bindings version="2.1"
xmlns:jxb="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"
jxb:extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="XMLSchema.xsd">
<jxb:schemaBindings>
<jxb:package name="org.w3.xmlschema"/>
</jxb:schemaBindings>
<jxb:bindings node="//xs:complexType[@name=''complexType'']">
<jxb:class name="AbstractComplexType"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''group'']">
<jxb:class name="AbstractGroup"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''attributeGroup'']">
<jxb:class name="AbstractAttributeGroup"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''simpleType'']">
<jxb:class name="AbstractSimpleType"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''element'']">
<jxb:class name="AbstractElement"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''attribute'']">
<jxb:class name="BaseAttribute"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
En mi opinión, esto da nombres de clases más claros y compila con éxito el esquema.
También recomendaría usar una compilación separada para XMLSchema.xsd y mantenerla en un archivo jar para su uso posterior en caso de que surja este problema nuevamente al compilar otro esquema. Las respuestas a esta pregunta describen cómo.
Puedes usar xjc que viene con JDK1.6. También puedes probar XML to Java, consulta este artículo .