我正在为我的项目使用jersey,并尝试从字符串中解析URI。
UriBuilder.fromUri("http://localhost:8000").build();
代码很简单,但我收到错误
java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
似乎程序找不到代理人。我已导入javax.ws.rs.core.UriBuilder
并且jersey-common 2.0
应包含我的构建路径中的委托。但我仍然得到这个错误。
有人知道如何修复它吗?谢谢!
答案 0 :(得分:57)
如果您使用的是Maven,请使用以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.22.2</version>
<scope>test</scope>
</dependency>
对于Gradle,以下内容将起作用:
testCompile 'org.glassfish.jersey.core:jersey-common:2.22.2'
答案 1 :(得分:5)
针对Wildfly 10.1运行时开发我不想将Jersey引入我的构建中。使用Gradle我用了
testRuntime "org.jboss.resteasy:resteasy-jaxrs:$versions.resteasy"
resteasy版本是3.0.19.Final。这个jar包含
META-INF/services/javax.ws.rs.ext.RuntimeDelegate
带条目
org.jboss.resteasy.spi.ResteasyProviderFactory
答案 2 :(得分:3)
在我的情况下,问题是另一个名为: 的 javax.ws.rs-API-2.0.jar 强>
删除那个jar解决了我的问题。
我用过的罐子:
<include name="jersey-client-1.9.jar" />
<include name="jersey-core-1.9.jar" />
<include name="jersey-multipart-1.9.jar" />
答案 3 :(得分:1)
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.26</version>
<scope>test</scope>
</dependency>
我遇到了Java 8和jersey-common 2.22.2的问题,但2.26工作了。
答案 4 :(得分:0)
tl; dr如果您在还具有“ provider”类的应用程序中使用jersey-client 1.x,并且那里有rs-api-2.1.jar,则需要添加jersey-server 1 .x或删除rs-api-2.1(如果您碰巧还存在jsr311-api-1.1.1)。
看来这是正在发生的事情
显然,当jersey-client首次出现时,它会尝试创建具有不同mime类型的“ mime map”。
jersey-core 1.x ContextResolverFactory:
public void init(ProviderServices providersServices, InjectableProviderFactory ipf) {
Map<Type, Map<MediaType, List<ContextResolver>>> rs = new HashMap();
Set<ContextResolver> providers = providersServices.getProviders(ContextResolver.class);
Iterator i$ = providers.iterator();
while(i$.hasNext()) {
ContextResolver provider = (ContextResolver)i$.next();
List<MediaType> ms = MediaTypes.createMediaTypes((Produces)provider.getClass().getAnnotation(Produces.class));
...
因此,如果有任何“提供者”(例如:@Produces ({MediaType.WILDCARD})
)出现,它将尝试查找其类型并将其添加到mime类型列表中。但是,它会执行以下操作:
如果您有rs-api-2.1.jar:
private static RuntimeDelegate findDelegate() {
try {
Object delegate = FactoryFinder.find("javax.ws.rs.ext.RuntimeDelegate", "org.glassfish.jersey.internal.RuntimeDelegateImpl", RuntimeDelegate.class);
如果您还具有以下其他依赖关系,则其实现似乎有所不同:
jsr311-api-1.1.1.jar:
private static RuntimeDelegate findDelegate() {
try {
Object delegate = FactoryFinder.find("javax.ws.rs.ext.RuntimeDelegate", "com.sun.ws.rs.ext.RuntimeDelegateImpl");
Jersey 1.x客户端恰巧提供了./jersey-client-.19/com/sun/ws/rs/ext/RuntimeDelegateImpl.class
Jersey 1.x服务器提供:
./jersey-server-1.19/com/sun/jersey/server/impl/provider/RuntimeDelegateImpl.class
jersey 2.0是“ org.glassfish.jersey ...”,并提供了“ org.glassfish.jersey.internal.RuntimeDelegateImpl”(显然是明智的做法)
因此,在我看来rs-api-2.1
在默认情况下主要针对球衣2.x。但是如果您还包括jersey-server,碰巧也可以使用jersey-client 1.x。
使用jersey 2.x,您不需要以这种怪异的方式包含“使用客户端的服务器”,似乎就可以了。
我的直觉是更改了API(您不应该将jersey 1.x与jsr-2结合使用吗?是吧?),或者是偶然的错误,bug或jersey-client 1.x的不良设计,谁知道。
添加可以暂时添加“ jersey 2.x”或“ jersey-server 1.x”的内容也可以。
这些可以解决以下运行时故障:
Caused by: java.lang.ExceptionInInitializerError: null
at com.sun.jersey.core.spi.factory.ContextResolverFactory.init(ContextResolverFactory.java:86)
at com.sun.jersey.api.client.Client.init(Client.java:340)
at com.sun.jersey.api.client.Client.access$000(Client.java:119)
at com.sun.jersey.api.client.Client$1.f(Client.java:192)
at com.sun.jersey.api.client.Client$1.f(Client.java:188)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
at com.sun.jersey.api.client.Client.<init>(Client.java:188)
at com.sun.jersey.api.client.Client.<init>(Client.java:171)
at redacted
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at org.familysearch.digitalarchive.aggregator.integration.ServiceAccountConfig$$EnhancerBySpringCGLIB$$a3409578.identityService(<generated>)
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:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 29 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:154)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:121)
at javax.ws.rs.core.MediaType.valueOf(MediaType.java:196)
at com.sun.jersey.core.header.MediaTypes.<clinit>(MediaTypes.java:65)
... 48 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:111)
at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:209)
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:136)
... 51 common frames omitted
答案 5 :(得分:0)
compile 'org.springframework.boot:spring-boot-starter-jersey:1.2.0.RELEASE'
这对我有用!