2013-09-02 13 views
15

Próbuję użyć klienta Jersey do symulacji żądań HTTP do mojej usługi internetowej. Próbowałem zaimplementować simple example z dokumentacji. Oto mój krótki kod:NoSuchMethodError: MultivaluedMap.add All w Jersey Klient

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); 
} 

nawet nie realizować cały przykład, ponieważ obecnie otrzymuję wyjątek w ostatnim wierszu:

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) 

ja tylko dodatkiem tę zależność do mojego pom.xml:

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

Próbowałem rozwiązać problem z Google, a także debugować aplikację, ale nie mogę zobaczyć, co jest z nią nie tak.

EDIT

Wszystko Maven zależności:

<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

Czy możesz pokazać resztę swoich zależności? –

+1

@orid Dodano zależności. – Wojtek

Odpowiedz

31

To wygląda niezgodności związanej z wersją JAX-RS API (który zawiera MultiValuedMap).

Używasz klienta-klienta-klienta v2.2, który jest kompilowany z wersją 2.0 interfejsu API JAX-RS. Ale twoje środowisko uruchomieniowe uruchamia się z Java EE 6, która definiuje JAX-RS API v1.1. Tak więc twój kod oczekuje v2.0 interfejsu API JAX-RS, ale dostaje v1.1 w czasie wykonywania.

to API MultiValuedMap Java EE 6:

http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html (nie Sposób AddAll).

i Java EE 7:

http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html (ten obejmuje sposoby AddAll).

Ponieważ korzystasz z Java EE 6, powinieneś używać oprogramowania jersey-client v1.8, a nie 2.2. Lub powinno być w tym Java EE 7 API w ścieżce klas środowiska wykonawczego, a nie 6.

+1

Dziękujemy! Musi działać na Glassfish3, więc postanowiłem zachować JEE6 i używać 'jersey-client' 1.8. Jeszcze jedną rzeczą, która była błędna w moich zależnościach, był "dostarczony" zakres 'javaee-api'. Klient Jersey potrzebuje konkretnej implementacji, jeśli ma pracować poza serwerem (np. Podczas testów integracyjnych). Pomogło to: http: // stackoverflow.com/questions/12142872/java-lang-classformaterror-nieobecny-kod-atrybutu-w-metodzie-to-nie-natywne-o – Wojtek

+3

Mieszanie koszulki-klienta 1.8 i 2.x może spowodować taki problem. Po wyczyszczeniu zależności i tylko przy użyciu oprogramowania klienckiego-klienta 2.x ten sam problem zniknął w mojej aplikacji. – DerekY

+1

Myślałem, że usunąłem wszystkie zależności w jerseyach 1.x, ale odkryłem, że nadal miałem 'javax.ws.rs.jsr311-api 'wersja 1.1.1 w moich zależnościach. Po usunięciu problem zniknął ... – Jens

7

Klasa wykraczająca pochodzi z tego uzależnienia

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

To JAX-RS 1.1 Główne klasy wewnątrz, specjalnie MultivaluedMap interfejs bez metody addAll.

Albo go wyłączyć (Wydaje się to możliwe, jeśli tylko przy użyciu Jersey), lub upgrade do version do 7.0

+0

Ori Dar: w jaki sposób/czy dokładnie wyłączyłeś jax-rs 1.1 z zależności? Próbowałem wykluczyć rdzeń artefactId z grupy javax.ws.rs, a także jsr311-api z tej samej grupy co oddzielną próbę, a gdy już miałem zależność od javaee-api ustawioną na 7.0. W żadnym przypadku nikt nie pomógł sam. Czy powinno się użyć kombinacji lub innego wykluczenia? – mico

0

W moim przypadku wygląda to być problem niezgodności z Klientem Jersey Jersey Core. Przekroczyłem go, wyłączając klienta:

<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> 
Powiązane problemy