comment faire pour forcer le schéma des classes compilées pour étendre la classe spécifique, en dehors du schéma
Besoin d'aide avec la situation suivante:
Les utilisateurs peuvent créer leurs propres structures de données qui sont stockés en tant que JAXB-prêt XSD sources comme ci-dessous:
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Group" type="Group"/>
<xs:element name="Parameter" type="Parameter"/>
<xs:complexType name="Group">
<xs:sequence>
<xs:element name="caption" type="xs:string" minOccurs="0"/>
<xs:element name="parameters" type="Parameter" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Parameter">
<xs:sequence>
<xs:element name="key" type="xs:string" minOccurs="0"/>
<xs:element name="group" type="Group" minOccurs="0"/>
<xs:element name="value" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Après, nouveau ou modifié, schéma apparaît, il est automatiquement analysé par le compilateur de Schéma, des sources java généré, compilé et emballés dans de l'utilisateur pots:
SchemaCompiler sc = XJC.createSchemaCompiler();
//Input source for schema
InputSource is = new InputSource(new StringInputStream(objectPackage.getObjectSchema()));
//Parse
sc.parseSchema(is);
S2JJAXBModel model = sc.bind();
//Generate source
JCodeModel jCodeModel = model.generateCode(null, null);
jCodeModel.build(packageSourceDirectory);
//Compile and package
//......
Et tout était ok jusqu'à ce qu'il a été décidé que tous les utilisateurs de générer les classes doivent s'étendre sur une catégorie connue, dire UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
et
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Tout est à la volée, je ne peux pas forcer les utilisateurs à modifier leur schéma de fichiers, mais je peut les transformer avant la génération de code.
On dirait que j'ai deux options pour introduire ce UserRootObject
: d'une certaine façon par JCodeModel
ou en quelque sorte de transformer les fichiers de schéma avant de construire des sources Java.
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas qu'il y est un moyen facile de le faire à l'aide de JAXB lui-même. Il y a un certain nombre d'options de personnalisation disponibles qui ne sont pas généralement connus de lire l'article 7 de JSR222 pour plus de détails.
Si vous avez un certain contrôle sur la saisie de schémas, alors vous pouvez envisager d'utiliser XSLT pour transformer le schéma. Je crois que cela peut être fait en utilisant un
javax.xml.transform.dom.DOMResult
instance en tant que cible de la transformation et de l'utilisation de la sortie comme une arborescence DOM (par exemple, l'appel degetNode()
sur le résultat) comme entrée deparseSchema
. Une transformation de base serait de remplacer:avec quelque chose comme:
Bien sûr, cela ne fonctionne que pour les cas simples. Si vous avez déjà l'héritage dans vos fichiers de schéma, alors vous aurez à faire un filtrage dans la transformation XSLT qui ne s'applique cette transformation pour les types qui n'ont pas déjà étendre.
XJC a une extension pour cette fin
Pour plus d'informations, voir:
Le schéma, les annotations peuvent aussi être alimentés par un externe fichier de liaisons. Pour un exemple, voir:
Un grand merci à D. Shawley pour souligner la bonne section dans la JSR 222. Voici la solution finale qui pourrait être utile et gain de temps pour quelqu'un d'autre.
Schéma d'origine doit être transformée comme suit:
Transformation peut être facilement réalisée par org.le w3c.dom.Document interface.
C'est un peu un vieux sujet, mais juste pour le record:
Vous pouvez faire cela avec le jaxb2 héritage plugin. Comme ceci:
Voir par exemple ici http://vistaofjavahorizon.blogspot.com/2014/07/how-to-have-particular-java-class.html
Il y a d'autres exemples en ligne.