BreizFenrir Posté(e) le 5 avril 2012 Partager Posté(e) le 5 avril 2012 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 More sharing options...
Olipla Posté(e) le 9 avril 2012 Partager Posté(e) le 9 avril 2012 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 More sharing options...
BreizFenrir Posté(e) le 10 avril 2012 Auteur Partager Posté(e) le 10 avril 2012 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 More sharing options...
BreizFenrir Posté(e) le 11 avril 2012 Auteur Partager Posté(e) le 11 avril 2012 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 11 avril 2012 Partager Posté(e) le 11 avril 2012 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.