Java NoSuchMethodError:泽西客户端中的 MultivaluedMap.addAll
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18574145/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NoSuchMethodError: MultivaluedMap.addAll in Jersey Client
提问by Wojtek
I'm trying to use Jersey Client to simulate HTTP requests to my web service. I tried to implement the simple examplefrom the documentation. Here's my short code:
我正在尝试使用 Jersey 客户端来模拟对我的 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);
}
I didn't even implement the whole example, because currently I get an exception in the last line:
我什至没有实现整个示例,因为目前我在最后一行遇到异常:
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.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.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.2</version>
</dependency>
0(ParentRunner.java:42)
at org.junit.runners.ParentRunner.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)
I only added this dependency to my pom.xml
:
我只将此依赖项添加到我的pom.xml
:
<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>
I tried to google the problem, as well as debug the application, but I can't really see what's wrong with it.
我试图用谷歌搜索这个问题,并调试应用程序,但我真的看不出它有什么问题。
EDIT
编辑
All Maven dependencies:
所有 Maven 依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
采纳答案by Alexander Bollaert
This looks like an inconsistency pertaining to the JAX-RS API version (which contains the MultiValuedMap).
这看起来与 JAX-RS API 版本(包含 MultiValuedMap)有关。
You are using client jersey-client v2.2, which is compiled against v2.0 of the JAX-RS API. But your runtime states to run with Java EE 6, which defines JAX-RS API v1.1. So your code expects v2.0 of the JAX-RS API, but gets v1.1 at runtime.
您正在使用客户端 jersey-client v2.2,它是针对 JAX-RS API 的 v2.0 编译的。但是您的运行时声明使用 Java EE 6 运行,它定义了 JAX-RS API v1.1。所以您的代码需要 JAX-RS API 的 v2.0,但在运行时得到 v1.1。
This is the MultiValuedMap API for Java EE 6:
这是 Java EE 6 的 MultiValuedMap API:
http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html(no addAll method).
http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html(无 addAll 方法)。
And for Java EE 7:
对于 Java EE 7:
http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html(this one includes the addAll method).
http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html(这个包括 addAll 方法)。
As you are using Java EE 6, you should be using jersey-client v1.8, not 2.2. Or you should be including the Java EE 7 API in your runtime classpath, and not 6.
当您使用 Java EE 6 时,您应该使用 jersey-client v1.8,而不是 2.2。或者您应该在运行时类路径中包含 Java EE 7 API,而不是 6。
回答by Ori Dar
The offending class comes from this dependency
违规类来自此依赖项
<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>
It has jax-rs 1.1 core classes inside, specifically MultivaluedMap
interface without addAll
method.
它内部有 jax-rs 1.1 核心类,特别是MultivaluedMap
没有addAll
方法的接口。
Either disable it (It seems you can if only using Jersey), or upgrade to version
to 7.0
要么禁用它(似乎你可以只使用 Jersey),或者升级version
到7.0
回答by Bob Small
In my case this looks to be an incompatibility issue with Jersey Client and Jersey Core. I got past it by disabling the client:
在我的情况下,这看起来是 Jersey Client 和 Jersey Core 的不兼容问题。我通过禁用客户端来克服它:
##代码##