Aller au contenu

[RÉSOLU] IllegalAnnotationException sur initialisation de client web service


Messages recommandés

Bonjour,

Cela fait plusieurs jours que je me bats avec ce problème, sans réussir à voir de piste qui ne s'avère pas un cul-de-sac.

D'abord, le contexte : j'ai une application qui se charge à partir du contenu d'une base de donnée de générer des fichiers Excel. À ce niveau-là, zéro problème. Cette application reçoit des demandes de génération de fichiers via un service web. J'utile à cette fin Metro 2.0, de fait de sa bonne intégration avec Netbeans. Le client et le serveur, avant l'ajout dont il est question ci-après, fonctionnaient bien. La JVM utilisée est la 1.6 de Sun.

Une fonctionnalité supplémentaire a été développée : la possibilité pour les fichiers générés d'être mis sur une autre machine après génération. À cette fin une application additionnelle a été développée. Le premier serveur, après génération d'un lot de fichier, la sollicite via service web pour lui indiquer de télécharger les fichiers. Les mêmes outils sont ici utilisés. Au final, cela donne l'architecture suivante.

(client) --ws--> (serveur génération) --ws--> (serveur stockage)

Sauf que ça ne fonctionne alors plus comme attendu. Au moment de la création de l'objet représentant le service exposé par le serveur de stockage (voir code plus loin), une exception est lancée et tout foire. La partie intéressante de la trace est la suivante :

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptionsTwo classes have the same XML type name "address". Use @XmlType.name and @XmlType.namespace to assign different names to them.	this problem is related to the following location:			at com.sun.xml.ws.developer.MemberSubmissionEndpointReference$Address			at public com.sun.xml.ws.developer.MemberSubmissionEndpointReference$Address com.sun.xml.ws.developer.MemberSubmissionEndpointReference.addr			at com.sun.xml.ws.developer.MemberSubmissionEndpointReference	this problem is related to the following location:			at javax.xml.ws.wsaddressing.W3CEndpointReference$Address			at private javax.xml.ws.wsaddressing.W3CEndpointReference$Address javax.xml.ws.wsaddressing.W3CEndpointReference.address			at javax.xml.ws.wsaddressing.W3CEndpointReferenceTwo classes have the same XML type name "elements". Use @XmlType.name and @XmlType.namespace to assign different names to them.	this problem is related to the following location:			at com.sun.xml.ws.developer.MemberSubmissionEndpointReference$Elements			at public com.sun.xml.ws.developer.MemberSubmissionEndpointReference$Elements com.sun.xml.ws.developer.MemberSubmissionEndpointReference.referenceProperties			at com.sun.xml.ws.developer.MemberSubmissionEndpointReference	this problem is related to the following location:			at javax.xml.ws.wsaddressing.W3CEndpointReference$Elements			at private javax.xml.ws.wsaddressing.W3CEndpointReference$Elements javax.xml.ws.wsaddressing.W3CEndpointReference.referenceParameters			at javax.xml.ws.wsaddressing.W3CEndpointReference	at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)	at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)	at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)	at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1136)	at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)	at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)	... 63 more

Les deux classes dont il est ici question, MemberSubmissionEndpointReference et W3CEndpointReference sont contenus respectivement dans les bibliothèques webservices-rt.jar et webservices-api.jar. Toutes deux faisant partie de Metro 2.0. Ci-après, des extraits de leur contenu (uniquement ce qui semble être relatif à l'erreur ci-dessus, le reste est élagué).

// MemberSubmissionEndpointReference@XmlRootElement(name = "EndpointReference", namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")@XmlType(name = "EndpointReferenceType", namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")public final class MemberSubmissionEndpointReference extends EndpointReference implements MemberSubmissionAddressingConstants {public static class Elements {}public static class Address {}}// W3CEndpointReference@XmlRootElement(name="EndpointReference",namespace=W3CEndpointReference.NS)@XmlType(name="EndpointReferenceType",namespace=W3CEndpointReference.NS)public final class W3CEndpointReference extends EndpointReference {private static class Address {}private static class Elements {}protected static final String NS = "http://www.w3.org/2005/08/addressing";}

Je dois avouer que je suis un peu dépassé par tout ça. Ces deux classes semblent relatives au mapping Java/XML, et utilisent des namespaces différents. Mais ces namespaces semblent ignorés (par qui ? dans quel cadre ?) ce qui provoque des conflits.

En tout cas, l'exception est lancée lors de l'exécution du code suivant, où la classe Service est plus précisément javax.xml.ws.Service.

final Service serv = Service.create(wsdl, SERVICE_NAME);

Je n'ai pour le moment testé mes applications qu'avec JOnAS, mais il faut aussi que je le fasse avec un Tomcat nu (vive les environnements hétérogènes !). Je me demande si je n'aurais pas d'autres surprises qui pourraient m'orienter vers l'origine exacte du problème et sa solution. Avec Metro 2.1, même problème. Il faut que je teste avec la 2.2 mais je ne me fais pas d'illusion.

Je vous tiendrais au courant de mes prochaines expérimentations et de leurs résultats. Aussi, je répondrais à toutes les questions que vous auriez sur des points important que j'aurais ici oubliés. Toute suggestion sera la bienvenue.

Rapidement, quelques liens relatifs à l'erreur, mais qui ne m'ont pas aidé plus que ça (j'ai pu y louper des informations importantes néanmoins) :

- "Two classes have the same XML type name" - error when deploying in Tomcat (java.net, 2008)

- Same application deployed twice gives "2 counts of IllegalAnnotationExceptions" initialization error (jboss.org, 2006)

- a problem when call web service using web service client (jboss.org, 2008)

Lien vers le commentaire
Partager sur d’autres sites

D'après ce que j'ai pu lire, il s'agit d'un problème de conflit. JOnAS 5 supporte JAX-WS en standard, ce qui entre en conflit avec Metro. Donc soit abandonne Metro, soit enlève jaxws dans l'entrée jonas.services de jonas.properties.

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta proposition. J'ai supprimé jaxws dans jonas.properties, mais cela n'a rien changé. Je pense que le problème auquel tu fais référence est celui que j'avais rencontré auparavant, à savoir une incompatibilité entre la version de JAX-WS déjà présente dans la JVM 1.6 et celle utilisée par Metro. Ce problème fut résolu en mettant le fichier webservices-api.jar dans le dossier endorsed du JRE.

Bref, il ne me reste plus qu'à lâcher Metro. Il était déjà prévu à court-moyen terme que nous passions à Apache CXF. Cela ne fait donc qu'accélérer la migration. Dès que j'ai confirmation du bon fonctionnement de mes applications, je mettrais ce sujet en résolu. En tout cas, c'est plus un contournement qu'une résolution, mais l'important est avant tout que ça fonctionne. ;)

Lien vers le commentaire
Partager sur d’autres sites

J'ai fini par y arriver. Je n'ai pas compris dans le détail pourquoi ça merdait, mais faire l'action suivante corrige le problème : désactiver le modèle de délégation Java 2 pour mon application. Cela se fait à l'aide du descripteur de déploiement jonas-web.xml, qui est packagé dans le WAR, à l'aide du nœud XML suivant :

<java2-delegation-model>false</java2-delegation-model>

À vue de nez, dans la hiérarchie des classloaders dont l'application déployée dépend, il y a des classes qui sont en conflit avec celles packagées dans la bibliothèque Metro. Avec le modèle de délégation par défaut, au moment de charger les classes ils prenait celles qui correspondaient dans le contexte général, et non pas celles packagées exprès avec l'application. Je suppose que l'erreur IllegalAnnotationException finalement remontée n'était qu'un symptôme du problème, et que dans le cadre d'une utilisation correcte les deux classes en conflit ne sont jamais chargées en même temps.

Problème résolu donc.

Pour la petite blague, je suis tombé sur la solution par accident, en me documentant sur CXF. Autant dire que si j'avais lâché l'affaire plus tôt, j'aurais trouvé cette solution plus rapidement. :dd:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...