Fichier de liaison JAXB: XmlAdapters et nom du package
J'ai une liaison de fichier comme ceci
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<jxb:bindings schemaLocation="example.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="example" />
</jxb:schemaBindings>
<jxb:globalBindings>
<jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
<jxb:javaType name="java.util.Calendar" xmlType="xs:date"
parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
printMethod="javax.xml.bind.DatatypeConverter.printDate" />
<jxb:javaType name="java.util.Calendar" xmlType="xs:time"
parseMethod="javax.xml.bind.DatatypeConverter.parseTime"
printMethod="javax.xml.bind.DatatypeConverter.printTime" />
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
Le schéma de classe sont générés en "exemple" (correct), mais le XmlAdapters dans "org.w3._2001.xmlschema" (faux). Comment puis-je résoudre ce problème?
source d'informationauteur Puce
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème, résolu en utilisant cette.
La
org.w3._2001.xmlschema
package est créé ici parce que XJC, doit générer une classe qui étend la classejavax.xml.bind.annotation.adapters.XmlAdapter
qui à son tour appelle votre parse/impression des méthodes statiques. Pour une raison quelconque, il les met dans ce paquet, plutôt que quelque part plus utile.Vous n'avez pas dit qui JAXB mise en œuvre, mais le JAXB RI a une extension de la
javaType
de liaison de personnalisation qui vous permet de spécifier une sous-classe deXmlAdapter
directement, plutôt que deparseMethod
/printMethod
paires. Cela supprime le besoin de générer le synthétiqueXmlAdapter
pont de la classe. Voir la RI docs pour savoir comment faire cela.J'imagine EclipseLink/Moxy a quelque chose de semblable à cela, mais je ne suis pas sûr si le XJC livré avec Java6 est capable de faire ça (le Soleil semble avoir supprimé la moitié des trucs utiles, à partir de la RI quand ils l'ont ramené dans la JRE).
Pour Apache CXF utilisateurs, de la façon la plus propre est d'utiliser le
-p
option offerte parwsdl2java
.Dans notre cas
Si vous utilisez le cxf-codegen-plugin, puis il suffit d'ajouter une autre paire de
<extraarg>
.Pas besoin d'un targetNamespace de pointage à l'réservés XSD espace de noms et pas besoin de fourre-tout jaxb paquet de liaison.
La meilleure façon d'utiliser GlobalBinding est de spécifier explicite de l'adaptateur à la place de l'utilisation de cette parse/imprimer la paire. Par exemple, au lieu de l'suivantes:
Au lieu de cela, vous devez:
N'oubliez pas d'ajouter de l'espace de noms pour xjc:
La classe LongAdapter serait comme ceci:
De cette façon, depuis que vous avez spécifié adaptateur classes explicitement, jaxb ne génère pas d'adaptateurs par défaut avec la valeur par défaut nom du package org.w3._2001.xmlschema.
Il est très important d'éviter d'utiliser la valeur par défaut nom du package org.w3._2001.xmlschema. En prenant un exemple, si vous avez un projet et un projet B, et tous les deux ont des schéma et des liaisons. Dans l'ancien, les deux d'entre eux de générer des cartes avec exactement les même noms qualifiés, par exemple, org.w3._2001.xmlschema.Adapter1. Cependant, cet adaptateur peut être Longtemps dans le cadre d'Un projet pour l'Entier du projet B. Alors, disons que vous avez un en aval du projet C à l'aide de A et de B. Maintenant, le problème devient méchant. Si C doit utiliser Adapter1, vous ne pouvez pas prédire l'utilisé est celui d'Un Long ou d'un B pour Entier. Ensuite, votre application C pourrait bien fonctionner dans un certain temps, mais peut-être échouer dans une étrange façon dans d'autres situations. Si cela se produit, le type d'exception comme:
La solution indiquée par le Roy Truelove ne semble pas fonctionner quand je l'ai essayé dans mon environnement avec maven-jaxb2-plugin, même si la théorie est correcte.
Utiliser le construit en convertisseurs pour la commune de types de données.