NoSuchMethodError:Jersey客户端中的MultivaluedMap.addAll

我正在尝试使用Jersey Client来模拟对我的Web服务的HTTP请求。 我试图从文档中实现这个简单的例子 。 这是我的简短代码:

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

我甚至没有实现整个示例,因为目前我在最后一行得到了一个exception:

 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) 

我只将这个依赖项添加到我的pom.xml

  org.glassfish.jersey.core jersey-client 2.2  

我试图谷歌问题,以及调试应用程序,但我真的不知道它有什么问题。

编辑

所有Maven依赖项:

  junit junit 4.8 test   org.eclipse.persistence eclipselink 2.0.2   org.eclipse.persistence javax.persistence 2.0.0   com.sun.jersey jersey-bundle 1.8   com.google.protobuf protobuf-java 2.4.1   javax javaee-api 6.0 provided   commons-io commons-io 2.1   commons-lang commons-lang 2.3   org.slf4j slf4j-api 1.6.4   log4j log4j 1.2.16   org.slf4j slf4j-log4j12 1.6.4   org.glassfish.jersey.core jersey-client 2.2  

这看起来像是与JAX-RS API版本(包含MultiValuedMap)有关的不一致。

您正在使用客户端jersey-client v2.2,它是针对JAX-RS API的v2.0编译的。 但是您的运行时声明要使用Java EE 6运行,它定义了JAX-RS API v1.1。 因此,您的代码需要JAX-RS API的v2.0,但在运行时获得v1.1。

这是Java EE 6的MultiValuedMap API:

http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html (没有addAll方法)。

对于Java EE 7:

http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html (这个包含addAll方法)。

在使用Java EE 6时,您应该使用jersey-client v1.8,而不是2.2。 或者您应该在运行时类路径中包含Java EE 7 API,而不是6。

违规类来自这种依赖

  javax javaee-api 6.0 provided  

它里面有jax-rs 1.1核心类,特别是没有addAll方法的addAll接口。

要么禁用它(如果只使用Jersey,似乎可以),或升级到version 7.0

就我而言,这看起来与Jersey Client和Jersey Core存在不兼容问题。 我通过禁用客户端来解决它:

   org.apache.httpcomponents httpclient 4.5.2   org.apache.httpcomponents httpcore 4.4.4   pl.pragmatists JUnitParams 1.0.5   org.slf4j slf4j-log4j12 1.7.12 test        org.apache.poi poi-ooxml 3.14   log4j log4j 1.2.17   junit junit 4.12   com.googlecode.json-simple json-simple 1.1   org.apache.commons commons-lang3 3.4   org.seleniumhq.selenium selenium-java 2.45.0 test   org.projectlombok lombok 1.16.8 provided   com.saucelabs sauce_junit 2.1.18 test   javax.ws.rs javax.ws.rs-api 2.0.1   org.glassfish.jersey.core jersey-client 2.16