2017-01-02 126 views
2

我正在嘗試爲我的Jersey 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(); 

但這是一個InstantiationException在線.register(MultiPartFeature.class)失敗。這裏是完整的堆棧跟蹤:

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

我可能知道發生了什麼。聽起來像我在我的類路徑和CXF的舊版本。正在檢查...將更新我的帖子。 – dadoonet

回答

3

該問題是由我的項目中的另一個依賴引起的:org.apache.tika:tika-langdetect:1.14。 tika-langdetect將apache 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) 

我現在需要理解爲什麼其實這CXF的依賴是混淆新澤西但這是另一個故事:)

編輯:基本上你不能在相同的類路徑上同時擁有CXF和Jersey,因爲它們爲相同的JaxRS功能提供不同的實現。

我的項目,我不需要提卡上傳/下載功能,這樣我就可以簡單地從蒂卡依賴排除的Apache 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

有沒有辦法做到這一點在maven?我正在閱讀該依賴順序,但由於它不是對我的項目的直接依賴關係,我不確定是否有辦法告訴項目只使用我選擇的實現。沒什麼大不了的。我只是要移動依賴於它自己的項目的代碼。 – ephemeralCoder