67 votes

JAXB - La propriété "Value" est déjà définie. Utilisez <jaxb:property> pour résoudre ce conflit.

Utilisation de JAXB pour générer des classes de liaison XML.

Le schéma est basé sur un ensemble de fichiers XML hérités, et comprend cet extrait :

L'attribut 'Value' entre en conflit avec la propriété 'value' de xs:string, et la génération de code échoue avec l'erreur :

com.sun.istack.SAXParseException2: La propriété "Value" est déjà définie. Utilisez <jaxb:property> pour résoudre ce conflit.

70voto

brass-kazoo Points 8755

La réponse réside dans l'utilisation des liaisons JAXB (site-template.xjb) :

Les expressions XPath localisent les noeuds et les renomment, évitant ainsi les conflits de nommage.

En utilisant ce fichier XML de liaisons, la classe Java générée finit par avoir le getValueAttribute() souhaité (ainsi que le getValue()).

3 votes

J'ai également eu ce problème et cette réponse l'a résolu, merci! J'aimerais ajouter que si vous générez la classe Java avec le plugin Maven jaxb, vous pouvez mettre le fichier xjb dans le même répertoire de ressources que le fichier XSD réel.

1 votes

Peut-on utiliser cette solution pour des XSD distants de quelque manière que ce soit ? Je reçois une erreur "n'est pas une partie de cette compilation". Merci.

4 votes

Où devrais-je placer ce fichier site-template.xjb?

31voto

Gary Points 826

Si vous voulez éviter de créer / modifier un fichier de liaisons JAXB et que vous ne vous souciez pas d'annoter votre XSD, vous pouvez ajouter l'annotation jxb:property à la définition de votre attribut, par exemple :

avec des ajouts appropriés à la balise xs:schema :

0 votes

Merci! Tu as sauvé ma journée :)

4 votes

C'était bien mieux pour moi. La réponse acceptée nécessitait une configuration que je ne pouvais pas gérer. Je voulais juste que ça fonctionne !

1 votes

Je pense que cette réponse serait plus appropriée pour être une réponse à une question correctement posée

7voto

rrayasam Points 71

Une fois que le fichier xxxx.xjb est créé pour le nom d'attribut en double "valeur" (valeur en double est fournie par défaut par JAXB) comme ci-dessous, exécutez la commande XJC pour créer des objets JAXB

xjc -p "com.track.doc" -d "C:\JAXBDocuments\prasam\Desktop\JAXB_me\DealerTrace" appSamp.xsd -b xxxx.xjb

appSmp.xsd:-

xxxx.xjb:-

0 votes

Salut, Merci pour la réponse. En fait, je rencontre le problème alors j'ai trouvé cette réponse et j'ai essayé de suivre les étapes fournies ici: J'ai placé les fichiers appSmp.xsd et 'xxxx.xjb' dans un répertoire avec le contenu fourni dans cette réponse. J'ai changé le chemin du fichier et j'ai exécuté la commande suivante: xjc -p "com.track.doc" -d "chemin" appSamp.xsd -b xxxx.xjb mais je reçois toujours l'erreur : `[ERROR] schema_reference.4: Impossible de lire le document de schéma '´chemin/appSamp.xsd', car 1) le document n'a pas pu être trouvé; 2) le document n'a pas pu être lu; 3) l'élément racine du document n'est pas . unknown location`

1voto

Aucun de ces bindings n'a fonctionné pour moi, j'ai obtenu cette erreur :

[ERROR] La évaluation du XPath ".//xs:attribute[@name='Value']" produit un noeud cible vide

Cela a produit un noeud cible vide... J'ai ensuite réalisé (après 30 minutes de désespoir) que mon binding visait un complexType au lieu d'un élément. La réponse était dans mon fichier xsd.

Merci

1voto

user1787681 Points 21

J'avais un problème en utilisant la solution avec Eclipse (essayé à la fois Helios SR1 et Juno SR1) et CXF 2.6.3. La solution était similaire à ce que Kaitsu dit. À savoir que le nouvel assistant Web Service d'Eclipse copie le wsdl dans le répertoire WebContent/wsdl. J'ai dû placer le wsdl et le fichier de liaison là moi-même. Sinon, le fichier de liaison donnait l'erreur "n'est pas une partie de cette compilation".

Je n'ai pas pu utiliser un schéma en ligne dans le WSDL mais ça a fonctionné avec un schéma externe comme dans la réponse n°1.

Je suis en train d'utiliser l'option de configuration de point de terminaison CXF Servlet. Dans mon WSDL j'ai :

L'assistant a généré ceci dans mon web.xml, qui fonctionne correctement :

  cxf
  /services/*

Mais il a mis ceci dans cxf-servlet.xml :

J'ai dû changer l'adresse en URL complète, comme ceci :

address="http://localhost:8080/Converter/services/Converter">

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X