javaee - jaxb impl github
JAXB:: xjc 2.2 no reconoce enlaces para tipos simples (1)
Tengo un montón de esquemas xsd, algunos de los cuales importan otros. Entonces, cada vez que invoco xjc (la tarea Ant o la herramienta de línea de comando) en algunos archivos xsd que importan otros, transfiero un archivo de enlaces para asegurar que las clases importadas no se vuelvan a generar (ya que ya se han generado para el esquema "upstread"). Esta solución se describe en esta publicación SO (respuesta de Blaise Doughan) .
Si bien este enfoque funciona para los tipos xsd: complexType , no parece funcionar para xsd: simpleType types. Aquí hay un ejemplo reducido para demostrar esto. Digamos que tenemos dos esquemas simples muertos uno importando el otro:
a.xsd ---import--> b.xsd
Los archivos son:
a.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.a"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://example.b"
schemaLocation="b.xsd"/>
</xs:schema>
b.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.b"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:b="http://example.b"
elementFormDefault="qualified">
<xs:simpleType name="ResourceType">
<xs:restriction base="xs:string">
<xs:enumeration value="alpha"/>
<xs:enumeration value="beta"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ResourceType2">
<xs:sequence>
<xs:element name="a" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Básicamente, a.xsd no hace nada y solo importa b.xsd . cuando uno invoca xjc en a.xsd de la siguiente manera:
xjc -d output -p example.a -npa a.xsd
usted obtiene:
output/
└── example
└── a
├── ObjectFactory.java
├── ResourceType2.java
└── ResourceType.java
Entonces, los archivos se generaron para el esquema importado. Como no queremos eso, definimos el siguiente archivo de enlaces para transmitir:
imported-bindings.xml
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="b.xsd">
<jxb:bindings node="//xs:simpleType[@name=''ResourceType'']">
<jxb:class ref="example.b.ResourceType"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name=''ResourceType2'']">
<jxb:class ref="example.b.ResourceType2"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
SIN EMBARGO, cuando invoquemos de nuevo xjc en a.xsd con la opción -b de la siguiente manera:
xjc -d output -p a.example a.xsd -b imported-bindings.xml
vemos lo siguiente en el directorio de salida:
output/
└── example
└── a
├── ObjectFactory.java
└── ResourceType.java
Es decir, la generación del xsd: complexType "ResourceType2" fue suprimida, pero xjc se adelantó y generó el código para el xsd importado : simpleType "ResourceType". ¿Algunas ideas?
ACTUALIZAR Todavía no he conseguido que esto funcione, excepto por una solución utilizando archivos de episodios generados automáticamente
La versión JAXB 2.2.x solo es compatible, supongo.