2015-12-18 1 views
2

L'exception est soulevée au cours de l'appel suivantjava.lang.NoSuchMethodError à javax.ws.rs.core.MultivaluedMap.addAll

Response response = client().target(rpTarget()) 
    .path(clusterPath()) 
    .queryParam("api-version", csmv2ApiVersion()) 
    .request(MediaType.APPLICATION_JSON) 
    .get(); 

La pile complète de l'exception est

java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V 
    at org.glassfish.jersey.client.ClientRequest.accept(ClientRequest.java:335) 
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:221) 
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:59) 

....

Je bâtirai mon pot d'application à l'aide "mvn package" et la sortie de génération a les éléments suivants

[INFO] Including javax.ws.rs:javax.ws.rs-api:jar:2.0.1 in the shaded jar. 

[INFO] Including org.glassfish.jersey.core:jersey-common:jar:2.19 in the shaded jar. 

Je semble utiliser la dernière version de javax.ws.rs-api.jar qui semble contenir la définition de la méthode MultivaluedMap.addAll, mais je reçois toujours cette exception.

Pourriez-vous me savoir ce que je manque?

+0

vous appelez une méthode qui n'existe pas - vérifiez à nouveau le doc de votre lib pour faire correspondre les arguments de l'appel avec la définition de la méthode –

+0

Ce problème n'est toujours pas résolu pour moi. Pendant la compilation en utilisant maven, j'ai vu un avertissement indiquant que javax.ws.rs-api.jar v2.0.1 et jersey-core.jar v1.9 ont tous deux implémenté la classe MultivaluedMap. La définition dans jersey-core.jar n'a pas la méthode addAll alors que celle dans javax.ws.rs-api.jar a la méthode. J'ai donc enlevé toutes les dépendances à jersey-core.jar v1.9 en utilisant la balise 'exclusions' dans mon fichier pom.xml. En dépit de ces changements, je vois toujours le même message d'erreur lorsque je lance mon application. J'utilise JDK version jdk1.7.0_79 pour construire et 1.7.0_91 pour exécuter mon application. Appréciez toute aide – Rajesh

Répondre

2

Il semble que vous ayez différentes versions de MultivaluedMap au moment de la compilation et de l'exécution. Ainsi, lorsque vous utilisez maven, vous compilez sans erreur sur une version spécifique de la bibliothèque, mais en fonction de la façon dont vous la compilez, vous pouvez utiliser une version différente au moment de l'exécution (par exemple intégrée au serveur) qui n'a pas cette méthode, résultant de l'exception. Vérifiez sur votre serveur quelle version il utilise et voyez s'il y a une différence entre celui-ci et celui que vous spécifiez dans votre fichier pom.xml. Vérifiez aussi l'attribut de portée pour cette dépendance, par défaut je crois est "compile" qui compilera réellement la bibliothèque dans votre fichier jar, "fourni" ne compilera pas la bibliothèque et s'attend à ce qu'elle soit fournie par d'autres moyens.

La chose importante à noter ici est que les versions des bibliothèques que vous utilisez lors de la compilation ne sont pas nécessairement les mêmes que celles que vous utilisez lors de l'exécution. Cela rend les choses plus faciles si vous pouvez vous assurer que les versions sur le serveur sont celles que vous voulez, plutôt que d'avoir deux versions différentes.

Voir la section 2.3 here, il contient des informations sur les dépendances maven de javax.ws.rs requises pour glassfish.