plugin java xsd jaxb

java - plugin - JAXB: Generando clases para dos XSD que comparten un XSD común



jaxb2-maven-plugin (2)

Tengo 2 archivos XSD de servicio AService.xsd y BService.xsd cada uno con targetNamespace diferente. Ambos utilizan un XSD común llamado common.xsd. Yo uso el complemento JAXB Maven para generar clases. Así es cómo,

<execution> <id>generate-package</id> <goals> <goal>generate</goal> </goals> <configuration> <extension>true</extension> <schemaIncludes> <include>schema/Aservice.xsd</include> <include>schema/Bservice.xsd</include> </schemaIncludes> <bindingIncludes> <include>schema/*.xjb</include> </bindingIncludes> <generatePackage>com.schema</generatePackage> <generateDirectory>src/main/java</generateDirectory> </configuration> </execution>

Cuando intento ejecutar esto obtengo el siguiente error. ValidationType se define en common.xsd

org.xml.sax.SAXParseException: A class/interface with the same name "com.schema.ValidationType" is already in use. Use a class customization to resolve this conflict. .......... org.xml.sax.SAXParseException: (Relevant to above error) another "ValidationType" is generated from here. ...... com.sun.istack.SAXParseException2: Two declarations cause a collision in the ObjectFactory class.

Si ejecuto los 2 servicios xsds en 2 ejecuciones diferentes que se generan en 2 paquetes diferentes, obtengo la misma clase ValidationType en 2 paquetes diferentes.

¿Alguna idea sobre cómo hacer que JAXB reconozca esquemas compartidos?


Se enfrenta al llamado "esquema camaleónico", que se considera una mala práctica. Desafortunadamente, no hay una buena solución debido a la naturaleza de JAXB. La anotación JAXB vincula las propiedades del bean a elementos y atributos XML en espacios de nombres específicos (determinados en el tiempo de compilación del esquema). Así que una vez que se compila el esquema, no hay una buena forma oficial de cambiar los espacios de nombres de los elementos y atributos a los que están vinculadas sus propiedades.

Sin embargo, esto es exactamente lo que quiere lograr con los esquemas "camaleón". Las clases derivadas de "common.xsd" deberían asignarse de forma mágica al espacio de nombres A si se usan en las clases A y al espacio de nombres B si se usan en las clases B. Puedo imaginar esta magia, pero nunca vista en la vida real.

Dado que esencialmente desea que A / common y B / common sean "lo mismo", una de las maneras de resolverlo es generar A y B (ambas con común) en dos ejecuciones y hacer que las clases comunes implementen un cierto "común " interfaz. Entonces su software podría procesar A / common y B / common en el mismo faschion, independientemente del hecho de que estas son clases de los diferentes paquetes.

ACTUALIZAR:

Por el comentario veo que no tienes un esquema de camaleón, sino una importación normal. Es fácil entonces, simplemente compilar, A y B por separado. Consulte la compilación de esquemas separados para maven-jaxb2-plugin.


Personalicé los paquetes como se describe aquí . Así que common.xsd va en com.common.schema y es compartido por AService.xsd y BService.xsd que están en paquetes diferentes, ya que están en espacios de nombres diferentes.

El generatePackage se elimina de la configuración de Maven y se ve así:

<execution> <id>generate-package</id> <goals> <goal>generate</goal> </goals> <configuration> <extension>true</extension> <schemaIncludes> <include>schema/Aservice.xsd</include> <include>schema/Bservice.xsd</include> </schemaIncludes> <bindingIncludes> <include>schema/*.xjb</include> </bindingIncludes> <generateDirectory>src/main/java</generateDirectory> </configuration> </execution>