gpt4 book ai didi

java - 让 Jersey 1.x 和 2.x 共存

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:18 30 4
gpt4 key购买 nike

我有一个 Dropwizard 项目(使用 Jersey 2.x),我需要使用另一个库,该库依赖于 1.x 的 jersey-client,我在让两者在类路径中共存时遇到了一些麻烦.看起来正在发生的事情是 HK2 正在寻找任何实现 javax.ws.rs.* 提供者的东西,并试图实例化它们。当它是 Jersey 1.x 的类时,它需要的依赖注入(inject)不存在,我最终会遇到很多错误,例如:

Caused by: java.lang.IllegalArgumentException: The MultiPartConfig instance we expected is not present. Have you registered the MultiPartConfigProvider class?
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.<init>(MultiPartReaderClientSide.java:107)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1107)
at org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:274)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:368)

有没有办法让 Jersey 2.x/HK2 忽略 com.sun.jersey.* 包空间中的任何内容?

最佳答案

看起来 org.glassfish.jersey.internal.ServiceFinder 的默认行为是通过类路径上的 META-INF/services 查找服务实现。但是,它有一个 setIteratorProvider 方法,允许您设置备用 ServiceIteratorProvider 实现。我能够通过为它提供一个从 com.sun.jersey.* 中过滤掉任何类名的实现来解决问题。*

public class Jersey2ServiceIteratorProvider extends ServiceFinder.ServiceIteratorProvider {

ServiceFinder.DefaultServiceIteratorProvider delegate = new ServiceFinder.DefaultServiceIteratorProvider();
@Override
public <T> Iterator<T> createIterator(Class<T> service, String serviceName,
ClassLoader loader, boolean ignoreOnClassNotFound) {
return delegate.createIterator(service, serviceName, loader, ignoreOnClassNotFound);
}

@Override
public <T> Iterator<Class<T>> createClassIterator(Class<T> service, String serviceName,
ClassLoader loader, boolean ignoreOnClassNotFound) {
final Iterator<Class<T>> delegateClassIterator = delegate.createClassIterator(service, serviceName, loader, ignoreOnClassNotFound);
return Iterators.filter(delegateClassIterator, input -> !input.toString().startsWith("class com.sun.jersey"));
}
}

关于java - 让 Jersey 1.x 和 2.x 共存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632455/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com