2017-01-02 2 views
2

저지 REST 애플리케이션 용 테스트 케이스를 만들려고합니다. 저지 MultiPartFeature를 등록 할 수 없습니다.

나는 pom.xml에 이미 추가 :

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-multipart</artifactId> 
    <version>2.25</version> 
</dependency> 

나는 내 클라이언트를 만드는거야 :

Client client = ClientBuilder.newBuilder() 
     .register(MoxyJsonFeature.class) 
     .register(MultiPartFeature.class) 
     .build(); 

하지만이 라인 .register(MultiPartFeature.class)상의 InstantiationException와 함께 실패합니다. 다음은 전체 스택 추적입니다.

java.lang.RuntimeException: java.lang.InstantiationException: org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide 

    at __randomizedtesting.SeedInfo.seed([8269888A1B7E6430]:0) 
    at org.apache.cxf.jaxrs.impl.ConfigurationImpl.createProvider(ConfigurationImpl.java:199) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.register(ConfigurableImpl.java:102) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.register(ConfigurableImpl.java:97) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl$FeatureContextImpl.register(ConfigurableImpl.java:139) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl$FeatureContextImpl.register(ConfigurableImpl.java:120) 
    at org.glassfish.jersey.media.multipart.MultiPartFeature.configure(MultiPartFeature.java:67) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.register(ConfigurableImpl.java:86) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.doRegister(ConfigurableImpl.java:117) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.register(ConfigurableImpl.java:102) 
    at org.apache.cxf.jaxrs.impl.ConfigurableImpl.register(ConfigurableImpl.java:97) 
    at org.apache.cxf.jaxrs.client.spec.ClientBuilderImpl.register(ClientBuilderImpl.java:56) 
    at org.apache.cxf.jaxrs.client.spec.ClientBuilderImpl.register(ClientBuilderImpl.java:35) 
    at fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractRestITCase.startRestClient(AbstractRestITCase.java:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.carrotsearch.randomizedtesting.RandomizedRunner.invoke(RandomizedRunner.java:1764) 
    at com.carrotsearch.randomizedtesting.RandomizedRunner$6.evaluate(RandomizedRunner.java:811) 
    at com.carrotsearch.randomizedtesting.RandomizedRunner$7.evaluate(RandomizedRunner.java:827) 
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48) 
    at com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36) 
    at com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:367) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.InstantiationException: org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide 
    at java.lang.Class.newInstance(Class.java:427) 
    at org.apache.cxf.jaxrs.impl.ConfigurationImpl.createProvider(ConfigurationImpl.java:197) 
    ... 23 more 
Caused by: java.lang.NoSuchMethodException: org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3082) 
    at java.lang.Class.newInstance(Class.java:412) 
    ... 24 more 

여기서 내가 누락 된 부분을 이해하지 못합니다. 나는 Jersey documentation를 따라 갔지만 나는 무엇인가 놓쳤을지도 모른다. .register(MultiPartFeature.class) 행을 제거하면 클라이언트를 사용하여 정상적으로 REST 테스트를 실행할 수 있습니다.

아이디어가 있으십니까?

+0

. 내 classpath와 CXF의 이전 버전에있는 것처럼 들린다. 확인 중 ... 내 게시물을 업데이트합니다. – dadoonet

답변

3

내 프로젝트의 다른 종속성으로 인해 문제가 발생했습니다 : org.apache.tika:tika-langdetect:1.14. tika-langdetect는 약간의 저지에 문제가있는 classpath에 아파치 CXF를 추가합니다.

내 프로젝트에서 CXF를 제외하면, 나는 뉴저지는 "저지"클래스를 사용하고 있음을 볼 수있다 : 지금 실제로 CXF 종속성을 저지를 혼란하지만 그건 또 다른 이야기 이유를 이해할 필요가

at org.glassfish.jersey.media.multipart.MultiPartFeature.configure(MultiPartFeature.java:67) 
    at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:730) 
    at org.glassfish.jersey.model.internal.CommonConfig.configureMetaProviders(CommonConfig.java:648) 
    at org.glassfish.jersey.client.ClientConfig$State.configureMetaProviders(ClientConfig.java:372) 
    at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:405) 
    at org.glassfish.jersey.client.ClientConfig$State.access$000(ClientConfig.java:90) 
    at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:122) 
    at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:119) 
    at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:340) 
    - locked <0x1178> (a java.lang.Object) 
    at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java:733) 
    at org.glassfish.jersey.client.ClientRequest.getConfiguration(ClientRequest.java:286) 
    at org.glassfish.jersey.client.JerseyInvocation.validateHttpMethodAndEntity(JerseyInvocation.java:135) 
    at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:105) 
    at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:101) 
    at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:92) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343) 
    at fr.pilato.elasticsearch.crawler.fs.test.integration.FsCrawlerRestIT.testUploadFile(FsCrawlerRestIT.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 

을 :)

EDIT : 기본적으로 동일한 클래스 경로에 CXF와 Jersey를 둘 다 가질 수 없으며 동일한 JaxRS 기능에 대해 다른 구현을 제공합니다. 내 프로젝트에 대한

, 나는 티카는/다운로드 기능을 업로드 할 필요가 없습니다, 그래서 나는 단순히 함께 티카 종속성에서 아파치 CXF를 제외 할 수 있습니다 : 나는 무슨 일이 일어나고 있는지 알고있을

<dependency> 
     <groupId>org.apache.tika</groupId> 
     <artifactId>tika-parsers</artifactId> 
     <version>1.14</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.apache.cxf</groupId> 
       <artifactId>cxf-rt-rs-client</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tika</groupId> 
     <artifactId>tika-langdetect</artifactId> 
     <version>1.14</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.apache.cxf</groupId> 
       <artifactId>cxf-rt-rs-client</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

CXF가 해당 종속성에 필요한 경우이 충돌을 어떻게 피할 수 있습니까? 내 물건은 저지를 사용하고 종속성은 CXF를 사용합니다. – ephemeralCoder

+0

기본적으로 CXF와 Jersey를 동일한 클래스 경로에 둘 수는 없으므로 동일한 JaxRS 기능에 대해 다른 구현을 제공합니다. – dadoonet

+0

메이븐에서 할 수있는 방법이 없습니까? 종속성 순서가 중요하다는 것을 읽었지 만 프로젝트에 직접 의존하지 않기 때문에 내가 선택한 구현만을 사용하도록 프로젝트에 지시하는 방법이 있는지 확실하지 않았습니다. 그것은 큰 문제가 아닙니다. 나는 그 코드를 자신의 프로젝트에 종속시키는 코드를 옮기려고한다. – ephemeralCoder

관련 문제