簡體   English   中英

讓澤西島1.x和2.x共存

[英]Getting Jersey 1.x and 2.x to coexist

我有一個Dropwizard項目(使用Jersey 2.x),我需要使用另一個依賴於1.x的jersey-client的庫,我在同一個路徑上共存時遇到了一些麻煩。 看起來正在發生的事情是HK2正在發現任何從javax.ws.rs。*實現提供程序並試圖實例化它們的東西。 當它是來自Jersey 1.x的類時,它所需的依賴注入不存在,我最終會遇到很多錯誤,例如:

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"));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM