无法注册球衣 MultiPartFeature
Can not register jersey MultiPartFeature
我正在尝试为我的 Jersey REST 应用程序创建一个测试用例。
我已经在 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.evaluate(RandomizedRunner.java:811)
at com.carrotsearch.randomizedtesting.RandomizedRunner.evaluate(RandomizedRunner.java:827)
at org.junit.rules.ExternalResource.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 测试。
有什么想法吗?
问题是由我的项目中的另一个依赖项引起的:org.apache.tika:tika-langdetect:1.14
。 tika-langdetect 将 apache CXF 添加到类路径中,这似乎有点麻烦 Jersey。
当从我的项目中排除 CXF 时,我可以看到 Jersey 仅使用 "Jersey" 类:
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[=10=]0(ClientConfig.java:90)
at org.glassfish.jersey.client.ClientConfig$State.get(ClientConfig.java:122)
at org.glassfish.jersey.client.ClientConfig$State.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 依赖性让 Jersey 感到困惑,但那是另一回事了:)
编辑:基本上你不能在同一个类路径上同时拥有 CXF 和 Jersey,因为它们为同一个 JaxRS 功能提供不同的实现。
对于我的项目,我不需要 Tika upload/download 功能,因此我可以简单地将 Apache CXF 从 tika 依赖项中排除:
<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>
我正在尝试为我的 Jersey REST 应用程序创建一个测试用例。
我已经在 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.evaluate(RandomizedRunner.java:811)
at com.carrotsearch.randomizedtesting.RandomizedRunner.evaluate(RandomizedRunner.java:827)
at org.junit.rules.ExternalResource.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 测试。
有什么想法吗?
问题是由我的项目中的另一个依赖项引起的:org.apache.tika:tika-langdetect:1.14
。 tika-langdetect 将 apache CXF 添加到类路径中,这似乎有点麻烦 Jersey。
当从我的项目中排除 CXF 时,我可以看到 Jersey 仅使用 "Jersey" 类:
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[=10=]0(ClientConfig.java:90)
at org.glassfish.jersey.client.ClientConfig$State.get(ClientConfig.java:122)
at org.glassfish.jersey.client.ClientConfig$State.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 依赖性让 Jersey 感到困惑,但那是另一回事了:)
编辑:基本上你不能在同一个类路径上同时拥有 CXF 和 Jersey,因为它们为同一个 JaxRS 功能提供不同的实现。
对于我的项目,我不需要 Tika upload/download 功能,因此我可以简单地将 Apache CXF 从 tika 依赖项中排除:
<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>