JAXB génération de classe avec importé XSD et de liaison
Je suis en train de générer des classes à partir de la suite de common.xsd
laquelle les importations x.xsd
et y.xsd
.
common.xsd
est comme suit:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="mynamespace:x" schemaLocation="x.xsd"/>
<xs:import namespace="mynamespace:y" schemaLocation="y.xsd"/>
</xs:schema>
J'essaie d'utiliser une liaison de fichier qui spécifie une interface commune qui est mise en œuvre par les classes générées. Mon fichier de liaison est comme suit:
jaxb:extensionBindingPrefixes="inheritance" version="2.1">
<jaxb:globalBindings>
<jaxb:javaType name="java.lang.Long" xmlType="xsd:integer"/>
</jaxb:globalBindings>
<jaxb:bindings schemaLocation="common.xsd" node="/xsd:schema">
<jaxb:bindings node="xsd:complexType[@name='Customer']">
<inheritance:implements>jaxb.BaseMessage</inheritance:implements>
<jaxb:class />
</jaxb:bindings>
<jaxb:bindings node="xsd:complexType[@name='Payments']">
<inheritance:implements>jaxb.BaseMessage</inheritance:implements>
<jaxb:class />
</jaxb:bindings>
J'ai essayé de générer le code, mais il se plaint que:
[ERROR] XPath evaluation of "xsd:complexType[@name='Customer']" results in empty target node
[ERROR] XPath evaluation of "xsd:complexType[@name='Payments']" results in empty target node
Comment puis-je définir les nœuds dans les liaisons fichiers sont en fait dans l'individu externe les fichiers XSD, mais pas dans common.xsd
?
J'ai eu à remplir certaines pièces manquantes afin de produire le scénario de test dans ma réponse. Permettez-moi de savoir si j'ai fait toute les idées fausses au sujet de votre cas d'utilisation.
Salut, j'ai ouvert un bounty pour cette question, mais il n'est pas le même problème que j'ai eu. Mon problème vient lors de l'utilisation de wsdl2java et des liaisons. J'ai résolu le problème avec l'aide des réponses, donc je vais attribution de 50 points pour la bonne réponse à votre problème @vallismortis
désolé, @user3057702 posé la question... Avez-vous trouvé votre réponse???
Salut, j'ai ouvert un bounty pour cette question, mais il n'est pas le même problème que j'ai eu. Mon problème vient lors de l'utilisation de wsdl2java et des liaisons. J'ai résolu le problème avec l'aide des réponses, donc je vais attribution de 50 points pour la bonne réponse à votre problème @vallismortis
désolé, @user3057702 posé la question... Avez-vous trouvé votre réponse???
OriginalL'auteur user3057702 | 2015-04-21
Vous devez vous connecter pour publier un commentaire.
Normalement, la façon dont vous voulez le faire serait d'utiliser Composant de schéma Indicatifs (SCD) au lieu de XPath.
À l'aide de SCD pour les personnalisations
SCD de Soutien
Malheureusement, en raison d'un bug dans XJC, SCD ne fonctionne pas en combinaison avec extensions fournisseur. Vous verrez une erreur de ce type:
La auteur de
jaxb2-notions de base
a récemment écrit un explication détaillée de ce problème particulier. En gros, si vous voulez utiliser des extensions fournisseur, vous êtes coincé avec XPath (et ses limites) pour l'instant.Un XPath solution basée sur
Ici est un complet, qui travaillent par exemple à l'aide de XPath avec les extensions fournisseur sur la base des informations que vous avez fournies dans votre question. Je crois que la bonne façon de générer les classes à partir des schémas importés sont par le biais d'une des liaisons élément. Comme preuve que cela fonctionne comme prévu, la classe générée à partir de cette liaison (
Cust
) est visible et réutilisé par les classes générées parcommon.xsd
. Chaque produit de classe implémente la classe de basejaxb.BaseMessage
.Je crois que c'est une bonne solution que vous trouverez jusqu'à ce que le XJC bug est corrigé.
src/main/resources/bindings.xjb
:src/main/resources/schema/common.xsd
:src/main/resources/schema/x.xsd
:src/main/resources/schema/y.xsd
:build.xml
:schemaLocation
pointe vers le mauvais schéma. Je ne vois pas pourquoi Dcg étaient vraiment nécessaire ici.Je pense qu'il y a peut-être partie des cas d'utilisation que nous ne sommes pas voir ici. J'ai fait l'hypothèse que 'common.xml" peut-être le seul schéma sous contrôle du développeur, et qu'il pourrait être éventuellement être de nombreux autres schémas inclus, les types dérivés tous définis dans la "commune" de fichier. La façon dont la question est formulée, il me semble qu'il est souhaitable de ne pas se référer directement à tous les schémas importés. C'est un des cas qui scd a été conçue pour améliorer. Espérons OP répond et nous pouvons voir le reste des cas d'utilisation.
Hm, vous n'avez pas besoin de "contrôler" le schéma pour être en mesure d'appliquer les liaisons. J'ai compilé grandes collections de schémas avec (presque) pas de Dcg. Je dirais que nous avons fourni suffisamment d'indices. Ne vous attendez pas beaucoup de réaction de la nouvelle low-rep des utilisateurs.
OriginalL'auteur vallismortis
Je poste une deuxième réponse, car je crois que ce que vous essayez d'atteindre est possible sans extensions fournisseur, mais je pense aussi que ma réponse originale à cette question peut être utile à d'autres personnes qui ont besoin d'extensions fournisseur.
Cet exemple supprime également les espaces de noms, mais ils pourraient être ajoutés facilement. Le même script de construction est utilisé pour cette réponse comme dans mon précédent.
src/main/resources/bindings.xjb
:src/main/resources/schema/common.xsd
:src/main/resources/schema/x.xsd
:src/main/resources/y.xsd
:OriginalL'auteur vallismortis
Pourquoi ne pas vous suffit de pointer votre
schemaLocation
àx.xsd
ety.xsd
, où les types sont définis?OriginalL'auteur lexicore
Je pense qu'il ne fonctionne pas parce que vous n'avez pas à démarrer le noeud avec //
Essayez ceci:
node="/xsd:schema"
a été utilisé comme le nœud de départ. Généralement,xsd:complexType[@name='Customer']
devrait être un nœud enfant de l'élément de schéma. Cependant, XPath n'est pas de les trouver lors de l'importation à partir de schémas à l'aide de leurs propres espaces de noms.OriginalL'auteur Code_Eraser