JAXB: Génération de classes pour deux XSD partageant un même XSD

J’ai 2 fichiers de service XSD AService.xsd et BService.xsd chacun avec différent targetNamespace. Les deux utilisent un XSD commun appelé common.xsd. J’utilise le plugin JAXB Maven pour générer des classes. Voici comment,

 generate-package  generate   true  schema/Aservice.xsd schema/Bservice.xsd   schema/*.xjb  com.schema src/main/java   

Lorsque j’essaie de l’exécuter, j’obtiens l’erreur suivante. ValidationType est défini dans 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 je lance les 2 xsds de service dans 2 exécutions différentes générant dans 2 packages différents, je reçois la même classe ValidationType dans 2 packages différents.

Des idées sur la façon de faire en sorte que JAXB reconnaisse les schémas partagés?

Vous vous trouvez face à un “schéma caméléon”, considéré comme une mauvaise pratique. Malheureusement, il n’ya pas de bonne solution en raison de la nature de JAXB. Annotation JAXB lie les propriétés du bean aux éléments et atsortingbuts XML dans des espaces de noms spécifiques (déterminés lors de la compilation du schéma). Ainsi, une fois votre schéma compilé, il n’existe aucun moyen officiel de modifier les espaces de noms des éléments et des atsortingbuts auxquels vos propriétés sont liées.

Cependant, c’est exactement ce que vous voulez réaliser avec les schémas “caméléon”. Les classes dérivées de “common.xsd” devraient, d’une manière ou d’une autre, être mappées magiquement à l’espace de noms A si elles sont utilisées dans les classes A et à l’espace de noms B si elles sont utilisées dans les classes B. Je peux imaginer cette magie, mais jamais vue dans la vie réelle.

Puisque vous voulez essentiellement que A / common et B / common soient la même chose, une des manières de le résoudre est de générer A et B (les deux avec commun) dans deux exécutions et de faire en sorte que les classes communes implémentent un certain “common “interface Ensuite, votre logiciel pourrait traiter A / common et B / common dans le même faschion, indépendamment du fait qu’il s’agisse effectivement de classes des différents packages.

METTRE À JOUR:

D’après le commentaire, je ne vois pas de schéma de caméléon, mais simplement une importation normale. C’est facile alors, il suffit de comstackr commun, A et B séparément. Voir la compilation de schéma séparé pour maven-jaxb2-plugin.

J’ai personnalisé les paquets comme décrit ici . Ainsi, common.xsd va dans com.common.schema et est partagé par AService.xsd et BService.xsd tous deux BService.xsd dans des packages différents, car ils se trouvent dans des espaces de noms différents.

Le generatePackage est supprimé de la configuration maven et ressemble à ceci,

  generate-package  generate   true  schema/Aservice.xsd schema/Bservice.xsd   schema/*.xjb  src/main/java