tutorial restful jax example java jersey client jax-rs

java - restful - NoSuchMethodError: MultivaluedMap.addAll en el cliente de Jersey



restful java example (3)

En mi caso, esto parece ser un problema de incompatibilidad con Jersey Client y Jersey Core. Lo superé deshabilitando al cliente:

<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>

Estoy tratando de usar el Cliente de Jersey para simular solicitudes HTTP a mi servicio web. Intenté implementar el ejemplo simple de la documentación. Aquí está mi código corto:

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

Ni siquiera implementé el ejemplo completo, porque actualmente obtengo una excepción en la última línea:

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)

Solo agregué esta dependencia a mi pom.xml :

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

Traté de buscar el problema en Google, así como de depurar la aplicación, pero realmente no puedo ver qué tiene de malo.

EDITAR

Todas las dependencias de Maven:

<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>


Esto parece una inconsistencia relacionada con la versión de la API de JAX-RS (que contiene el MultiValuedMap).

Está utilizando el cliente jersey-client v2.2, que se compila contra la v2.0 de la API de JAX-RS. Sin embargo, su tiempo de ejecución se ejecuta con Java EE 6, que define la API JAX-RS v1.1. Entonces, su código espera v2.0 de la API de JAX-RS, pero obtiene v1.1 en tiempo de ejecución.

Esta es la API MultiValuedMap para Java EE 6:

http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html (sin método addAll).

Y para Java EE 7:

http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html (este incluye el método addAll).

Como está utilizando Java EE 6, debería usar jersey-client v1.8, no 2.2. O debería incluir la API de Java EE 7 en su classpath de tiempo de ejecución, y no 6.


La clase ofensiva proviene de esta dependencia.

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

Tiene clases centrales jax-rs 1.1 en su interior, específicamente la interfaz MultivaluedMap sin el método addAll .

Deshabilítelo (parece que puede hacerlo si solo usa Jersey) o actualice a la version 7.0