2013-09-02 2 views
15

Jersey 클라이언트를 사용하여 웹 서비스에 대한 HTTP 요청을 시뮬레이트하려고합니다. 문서에서 simple example을 구현하려고했습니다. 난 단지 내 pom.xml이 의존성을 추가NoSuchMethodError : Jersey 클라이언트의 MultivaluedMap.addAll

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) 

: 현재 내가 마지막 줄에 예외가 있기 때문에,

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

나는 심지어 전체 예제를 구현하지 않은 : 여기 내 짧은 코드의

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

나는이 문제를 구글뿐만 아니라 응용 프로그램을 디버깅하려고하지만 난 정말 뭐가 잘못 볼 수 없습니다.

편집

모든 메이븐 의존성 :

<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

나머지 pom 의존성을 표시 할 수 있습니까? –

+1

@orid 종속성을 추가했습니다. – Wojtek

답변

31

이합니다 (MultiValuedMap를 포함)를 JAX-RS의 API 버전에 관한 모순처럼 보인다.

JAX-RS API v2.0에 대해 컴파일 된 클라이언트 jersey-client v2.2를 사용 중입니다. 하지만 런타임은 JAX-RS API v1.1을 정의하는 Java EE 6로 실행됩니다. 그래서 여러분의 코드는 JAX-RS API의 v2.0을 기대하지만 런타임에 v1.1을 얻습니다.

http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html (NO 오퍼레이션과 addAll 방법) :

이 자바 EE 6의 MultiValuedMap의 API이다.

http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html (본가 및 addAll 방법을 포함한다) :

그리고 자바 EE 7

.

Java EE 6을 사용 중이므로 2.2가 아닌 jersey-client v1.8을 사용해야합니다. 또는 당신은 당신의 런타임 클래스 경로에 자바 EE 7 API를 포함해야한다, 그리고 6

+1

감사합니다. 글래스 피시 3에서 작동해야하므로 JEE6을 유지하고'jersey-client' 1.8을 사용하기로 결정했습니다. 내 의존성에 잘못된 점이 하나 더 있는데'javaee-api '의'제공된'범위였다. Jersey Client가 서버 외부에서 작업하는 경우 (예 : 통합 테스트 중에)이를 구현해야합니다. 이 도움이 : http : // stackoverflow.com/questions/12142872/java-lang-classformaterror-absent-code-attribute-in-non-native-o – Wojtek

+3

저지 클라이언트 1.8과 2.x를 함께 사용하면 이러한 문제가 발생할 수 있습니다. 종속성을 정리하고 jersery-client 2.x만을 사용하면 내 응용 프로그램에서도 동일한 문제가 발생합니다. – DerekY

+1

저지 1.x 종속성을 모두 제거했지만 여전히'javax.ws.rs.jsr311-api '가 있음을 발견했습니다. '버전 1.1.1에 의존합니다. 제거한 후에 문제가 사라졌습니다. – Jens

7

기분을 상하게하는 클래스는 구체적으로는 JAX-RS했다

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

이 종속성 내부 1.1 코어 클래스에서 MultivaluedMap 인터페이스를 제공 addAll 방법없이.

중 하나는 (그것은 당신 만 저지를 사용하는 경우 할 수있는 것)를 비활성화 또는 저지 클라이언트와 뉴저지 코어와의 호환성 문제로 보인다 version 내 경우

+0

Ori Dar : 의존성에서 jax-rs 1.1을 어떻게 사용 했습니까? 나는 별도의 try와 동일한 그룹의 jsr311-api도 javax.ws.rs 그룹에서 artifactId 코어를 제외하고 시도했다. 일단 javaee-api 종속성을 7.0으로 설정했다. 어느 경우에도 아무도 혼자 도왔습니다. 일부 콤보 또는 다른 제외를 사용해야합니까? – mico

0

7.0에 업그레이드하십시오. 나는 클라이언트를 비활성화시킴으로써 그것을 지나쳤습니다.

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