2013-09-02 10 views
15

Ich versuche, Jersey Client zu verwenden, um HTTP-Anforderungen an meinen Webdienst zu simulieren. Ich habe versucht, die simple example aus der Dokumentation zu implementieren. Hier ist mein kurzer Code:NoSuchMethodError: MultivaledMap.addAll in Jersey Client

public void restoreTest(String sessionId) throws Exception { 
    Client client = ClientBuilder.newClient(); 
    WebTarget target = client.target(idsUrl).path("restore"); 
    Form form = new Form(); 
    form.param("sessionId", sessionId); 
    target.request(MediaType.APPLICATION_FORM_URLENCODED_TYPE); 
} 

Ich habe nicht einmal das ganze Beispiel implementieren, da zur Zeit ich eine Ausnahme in der letzten Zeile erhalten:

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:254) 
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:232) 
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:60) 
    at org.icatproject.idsclient.TestingClient.restoreTest(TestingClient.java:112) 
    at org.icatproject.ids.ids2.ArchiveTest.restoreThenArchiveDataset(ArchiveTest.java:55) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

ich nur diese Abhängigkeit zu meinem pom.xml hinzugefügt:

<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>2.2</version> 
</dependency> 

ich habe versucht, das Problem, sowie debuggen der Anwendung google, aber ich kann nicht wirklich sehen, was mit ihm los ist.

EDIT

Alle Maven Abhängigkeiten:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.0.2</version> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>javax.persistence</artifactId> 
    <version>2.0.0</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-bundle</artifactId> 
    <version>1.8</version> 
</dependency> 
<dependency> 
    <groupId>com.google.protobuf</groupId> 
    <artifactId>protobuf-java</artifactId> 
    <version>2.4.1</version> 
</dependency> 
<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.1</version> 
</dependency> 
<dependency> 
    <groupId>commons-lang</groupId> 
    <artifactId>commons-lang</artifactId> 
    <version>2.3</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.4</version> 
</dependency> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>2.2</version> 
</dependency> 
+2

Können Sie den Rest Ihrer pom Abhängigkeiten zeigen? –

+1

@orid Die Abhängigkeiten wurden hinzugefügt. – Wojtek

Antwort

31

Dies sieht aus wie ein auf der JAX-RS API-Version betreffen Inkonsistenz (die die MultiValuedMap enthält).

Sie verwenden den Client Trikot-Client v2.2, der gegen v2.0 der JAX-RS API kompiliert wurde. Ihre Laufzeitumgebung wird jedoch mit Java EE 6 ausgeführt, wodurch JAX-RS API v1.1 definiert wird. Ihr Code erwartet daher v2.0 der JAX-RS-API, erhält aber zur Laufzeit v1.1.

Dies ist die MultiValuedMap API für Java EE 6:

http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html (keine addAll Methode).

Und für Java EE 7:

http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html (dies das addAll Verfahren umfasst).

Wie Sie 6 Java EE verwenden, sollten Sie Jersey-Client v1.8 verwenden, nicht 2.2. Oder sollten Sie in Ihrer Runtime-Classpath einschließlich der Java EE 7 API sein, und nicht die 6.

+1

Vielen Dank! Es muss auf Glassfish3 funktionieren, also entschied ich mich für JEE6 und benutze 'jersey-client' 1.8. Eine weitere Sache, die mit meinen Abhängigkeiten nicht stimmte, war der 'bereitgestellte' Bereich von' javaee-api'. Der Jersey Client benötigt eine konkrete Implementierung, wenn er außerhalb des Servers arbeiten soll (z. B. bei Integrationstests). Dies half: http: // stackoverflow.com/questions/12142872/java-lang-classformaterror-abwesend-code-attribut-in-methode-das-ist-nicht-nativ-o – Wojtek

+3

Das Mischen von Jersey-Client 1.8 und 2.x könnte ein solches Problem verursachen. Nach dem Bereinigen der Abhängigkeiten und nur mit jersery-client 2.x, ist das gleiche Problem in meiner Anwendung verschwunden – DerekY

+1

Ich dachte, dass ich alle Trikots 1.x Abhängigkeiten entfernt, aber festgestellt, dass ich noch 'javax.ws.rs.jsr311-api hatte 'Version 1.1.1 in meinen Abhängigkeiten. Nach dem Entfernen war das Problem verschwunden ... – Jens

7

Die säumige Klasse stammt aus dieser Abhängigkeit

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
</dependency> 

Es hat JAX-RS-1.1-Kernklassen innen, speziell MultivaluedMap Schnittstelle ohne addAll Methode.

entweder abschalten (Es scheint, Sie können, wenn nur mit Jersey), oder einem Upgrade auf version zu 7.0

+0

Ori Dar: Wie haben/würden Sie die jax-rs 1.1 genau deaktivieren? Ich versuchte, artifactId-Kern von der Gruppe javax.ws.rs auszuschließen, auch jsr311-api von der gleichen Gruppe als getrennter Versuch und einmal hatte ich sogar javaee-api-Abhängigkeit, die auf 7.0 eingestellt wurde. Keinen Fall, niemand hat alleine geholfen. Sollte eine Combo oder ein anderer Ausschluss verwendet werden? – mico

0

In meinem Fall sieht ein Kompatibilitätsproblem mit Jersey-Client und Jersey-Core sein. Ich kam vorbei, indem ich den Klienten deaktivierte:

<dependencies> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.5.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpcore</artifactId> 
      <version>4.4.4</version> 
     </dependency> 
     <dependency> 
      <groupId>pl.pragmatists</groupId> 
      <artifactId>JUnitParams</artifactId> 
      <version>1.0.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.7.12</version> 
      <scope>test</scope> 
     </dependency> 
     <!--<dependency>--> 
      <!--<groupId>com.sun.jersey</groupId>--> 
      <!--<artifactId>jersey-client</artifactId>--> 
      <!--<version>1.19</version>--> 
     <!--</dependency>--> 
     <dependency> 
      <groupId>org.apache.poi</groupId> 
      <artifactId>poi-ooxml</artifactId> 
      <version>3.14</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-java</artifactId> 
      <version>2.45.0</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>1.16.8</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.saucelabs</groupId> 
      <artifactId>sauce_junit</artifactId> 
      <version>2.1.18</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>javax.ws.rs-api</artifactId> 
      <version>2.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-client</artifactId> 
      <version>2.16</version> 
     </dependency> 
    </dependencies> 
Verwandte Themen