2015-04-14 10 views
7

Bir Dropwizard projem var (Jersey 2.x kullanarak). Burada 1.x ve I 'den jersey-client'a bağımlı olan başka bir kütüphane kullanmam gerekiyor. Her ikisi de sınıf yolunda bir arada var olmakta zorluk çekiyorlar. Neye benziyorsa, HK2'nin javax.ws.rs. Sağlayıcılarını uygulayan bir şeyi bulması ve bunları gerçekleştirmeye çalışmasıdır. o Jersey 1.x bir sınıf var, bu ihtiyacı bağımlılık enjeksiyon yoktur ve ben gibi hatalar sürü sonuna kadar:Jersey 1.x ve 2.x'in bir arada var olması için

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 almak için herhangi bir yolu var mı com.sun.jersey içinde bir şey yoksayın. * paket alanı?

cevap

10

Bu org.glassfish.jersey.internal.ServiceFinder için standart davranış, sınıf yolunda META-INF/hizmetleri aracılığıyla hizmet uygulamalarını bulmaktır. Ancak, alternatif bir ServiceIteratorProvider uygulaması ayarlamanıza olanak veren bir setIteratorProvider yöntemine sahiptir. Sorunu, com.sun.jersey 'den herhangi bir sınıf isimlerini filtreleyen bir uygulama vererek çözdüm. *

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 örneğini nasıl elde edebildiniz? – badunk

+0

io.dropwizard.Application # initialize geçersiz kılmama ekledim: ServiceFinder.setIteratorProvider (new Jersey2ServiceIteratorProvider()); –

İlgili konular