2015-04-14 3 views
7

У меня есть проект Dropwizard (с использованием Jersey 2.x), где мне нужно использовать другую библиотеку, которая имеет зависимость от jersey-client от 1.x и I ' у меня есть проблемы с тем, чтобы оба сосуществовали на пути к классам. Похоже, что происходит то, что HK2 находит что-нибудь, что реализует провайдеры от javax.ws.rs. * И пытается создать их. Когда это класс из Джерси 1.x, инъекции зависимостей, что она нуждается не там, и я в конечном итоге с большим количеством ошибок, таким как:Получение Jersey 1.x и 2.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) 

Есть ли способ, чтобы получить Джерси 2.x/HK2 к игнорировать что-либо в com.sun.jersey. * место в упаковке?

ответ

10

Похоже, что поведение по умолчанию для 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")); 
    } 
} 
+0

Как вы смогли получить экземпляр ServiceFinder? – badunk

+0

В моем переопределении io.dropwizard.Application # initialize я добавил это: ServiceFinder.setIteratorProvider (новый Jersey2ServiceIteratorProvider()); –

Смежные вопросы