Nous utilisons depuis longtemps Jaxb 2.1 dans notre système. Nous avons une plate-forme construite avec la fourmi et génère un tas de paquets déployés dans une heure d'exécution OSGI. Nous utilisons Java SE 6.
Nous utilisons JAXB lors du processus de construction pour générer des fichiers de données à partir de différents schémas. Ces classes sont emballées dans les paquets et utilisées dans le temps d'exécution pour sérialiser / désérialiser le contenu. En outre, nous utilisons Jaxb dans notre plate-forme en exécution pour générer des types de données à partir d'autres schémas fournis par l'utilisateur (une sorte de plate-forme MDA). P>
dans l'exécution OSGI, nous avons un paquet qui a le jays de Jaxb et exporte les forfaits nécessaires. Nous créons une instance JaxbContext avec le chemin de contexte de toutes les usines d'objet générées, afin que nous puissions faire appel à Marshall / Numarshall tous nos types de données. p>
qui fonctionne jusqu'à présent, mais nous essayons actuellement de passer à la dernière version stable de Jaxb L'erreur Deux classes ont le même nom de type XML "ObjectFactory" em> est imprimé pour chacune des usines d'objet générées Pendant le processus de construction. P> Nous avons vu plusieurs messages dans la même erreur, mais nous appliquons aux types générés, pas à l'usine d'objet. Nous pensons que JAXB peut ne pas identifier la classe ObjectFactory comme usine d'objet, mais comme un type de données. P> Une possibilité était que nous utilisions la version interne de JAXB à JAVA 6, nous avons donc décidé d'utiliser le système. Propriété Nous pensons que le problème peut être que nous utilisons une version différente de JAXB dans l'exécution de l'OSGI et dans le processus de construction, donc Le code généré n'est pas compatible. Mais peut-être avons-nous tort et il y a un autre problème. P> Avez-vous des idées? P> Merci d'avance. P> Nous créons le jaxbcontext de cette manière: p> Où contextpath est une chaîne contenant toutes les usines de nos objets séparés par ':', et le jaxserviceclassloader est: p> (éditer: après l'article d'Aaron) strong> p> J'ai débogué Tous les internes de JaxbContextImpl et la chose sont que le JaxbContexTimply tente d'obtenir les informations de type de nos classes d'objectifs, ce qui est faux. En fait, dans com.sun.xml.internal.bind.v2.model.impl.modelbuilder: 314, l'appel GetClassannotation () renvoie NULL, mais lorsque je vois l'instance, je peux voir l'annotation xmlregistrier. P> La chose est que, à ce point xmlregistricat.class.getClassloader () renvoie NULL, mais si je cours (((classe) c) .GETANNOTATIONS () [0] .AnnotationType (). GetClassLoader () Il renvoie le chargeur de classe de la Osgi bundle "lib.jaxb" qui contient mes pots Jaxb, qui est correct. P> Donc, je suppose que nous chargons en même temps deux versions différentes de XMLregistry, un de la JDK et de l'autre de Jaxb 2.2.4 pots. La question est la suivante: pourquoi? P> et, encore plus, au lieu de charger tous ces com.sun.xml.internal. * Les classes (comme Jaxbcontextextimpl), ne devraient pas être chargés et exécutant com.sun.xml .bind.v2.Runtime.jaxbcontextext de JAXB JARS? Pendant le processus de débogage, je peux voir que cela fait des choses avec une réflexion, mais je ne comprends pas pourquoi le fait. P> p>
4 Réponses :
Assurez-vous qu'il n'y a qu'un seul Si cela ne fonctionne pas, créez votre propre chargeur de classe qui ne voit qu'une seule usine. Cela ne devrait pas être nécessaire mais qui sait. P> li>
Essayez de définir un point d'arrêt sur jaxbcontextimpl.java:436 pour voir quels types informatiques traitent et pourquoi. p> li>
ol> @xmlregistry code> Annotation dans votre classe de classe (recherche de
xmlregistry.class code> fichier, pas d'utilisation). Peut-être que la mauvaise annotation est ramassée. P> li>
Salut, désolé pour la réponse tardive. 1. Il existe une xmlregistry.class à Jaxb-Api-2.2.4.jar (qui est à l'intérieur de mon ensemble "lib.jaxb") et dans les classes Java 1.6.jar. 2. Il est difficile de changer la mise en œuvre, je vais essayer que si je ne réussis pas avec 3. 3. J'ai débogué les internes, mais laissez-moi ajouter mon commentaire dans le poste principal.
Merci pour votre grand effort. Malheureusement, je suis hors de ma ligue, maintenant :-( Je suis sûr que c'est à cause de la façon dont Osgi / Java effectue une charge de classement (la règle est de charger d'abord du parent CL, de sorte que le code Java a priorité sur les classes qui Osgi ajoute à la classe de classe). En tant que test, essayez de spécifier votre implémentation JAXB dans la catégorie BOOT B> CLASSPATH (voir la documentation Comment définir cela: télécharger.oracle.com/javase/1.3/docs/tooldocs/win32/... ).
Bonjour Aaron, merci pour votre réponse. J'ai essayé d'ajouter les pots au bootclasspath mais cela ne fait aucune différence, la même exception est lancée.
Nous avons enfin trouvé une solution pour cela.
de la documentation JAXB ( Découverte de la mise en œuvre JAXB STROND> Section): P> http://jaxb.java.net/nonav/2.2.4-1 /docs/api/javax/xml/bind/jaxbcontext.html p> Nous avons essayé d'ajouter une ressource dans méta-inf / services / javax.xml.bind.jaxbcontext em> afin d'appliquer l'utilisation de com.sun.xml.bind.v2.contextFactory em> au lieu de l'usine interne du Sun. Cela n'a pas fonctionné, probablement parce que nous utilisons un ensemble d'Osgi. P> Quoi qu'il en soit, car nous utilisons notre propre chargeur de classe, nous remplacons la méthode GetResourceeStream (), appelée à partir de Contextfinder: 343 FORT>: P> @Override
public InputStream getResourceAsStream(String name)
{
if (name!=null && name.equals("META-INF/services/javax.xml.bind.JAXBContext"))
{
return new ByteArrayInputStream("com.sun.xml.bind.v2.ContextFactory".getBytes());
}
return super.getResourceAsStream(name);
}
J'ai eu le même problème, mais une cause différente. Même si cela pourrait ne pas réparer les problèmes des auteurs, je posterai cette réponse pour tous ceux-ci, lisant ce message plus tard et avoir le même problème que moi.
J'ai utilisé cette configuration de compilateur-plugin, qui exclua les fichiers package-Info.java de compilation. Après avoir supprimé les exclus, tout a fonctionné comme un charme! Il semble que Jaxb incluait des définitions importantes dans ces fichiers! P>
Crusk config: p> Configuration de travail: p>
J'ai eu un problème similaire lorsque vous essayez de déployer un service Web SOAP à base de printemps. J'ai ajouté un colis au contextpaths code> d'un
org.springframework.oxm.jaxb.jaxb2marshaller code> Spring Bean. Le problème était que la même classe était dans d'autres packages inclus dans le même
contextpaths code>. J'ai changé le script de construction de fourmis pour exclure ces autres classes du paquet que j'ajoutais, que cela résolvait la question. P>
À l'aide de Java SE 6, je vous recommanderais d'utiliser la dernière version du correctif de votre JAXB IPL qui prend en charge JAXB 2.1, sauf indication particulière de JAXB 2.2 que vous essayez d'utiliser.
Désolé de ne pas mentionner ça. La raison de passer à Jaxb 2.2.4 est que nous mettons à niveau notre version JAX-WS en 2.2.5 et cela dépend de cette version de JAXB ( JAX-WS.JAVA.NET/2.2.5/DOCS/RELEASENOTES.HTML ). Sinon, nous pourrions utiliser Jaxb 2.1.
On dirait que votre Jaxb Impl est traité par erreur
ObjectFactory code> en tant que classe de domaine. Ceci est probablement dû à la
@xmlregistry code> Annotation non reconnue en raison d'un
Classloader Code> Différence entre vos classes de domaine et la mise en œuvre JAX-WS. Créez-vous le
JaxBContext code> directement ou est la mise en œuvre JAX-WS?
Non, dans ce cas, je ne l'utilise pas via Jax-WS. Je crée directement le jaxbcontext qui passe le chemin de contexte avec toutes les usines d'objet comme paramètre. Le code n'a pas du tout changé, je viens de remplacer les pots de 2.1.9 par la version 2.2.4.
Depuis que vous êtes dans un environnement OSGI, je pense que vous êtes dans un cas où vos classes de domaine et votre jaxb implémentent différentes versions des fichiers binaires JAXB. Cela ne se passe-t-il pas auparavant car il n'y avait qu'une seule version du binaire Jaxb disponible. Pouvez-vous modifier votre code de sorte que lorsque vous créez le JaxBContext, vous passez le long du chargeur de classe qui contient vos classes de domaine chargées?
J'ai édité le message afin que vous puissiez voir le code que nous utilisons pour instancier un jaxbcontext.