2015-04-14 22 views
7

Mam projekt Dropwizard (przy użyciu domeny Jersey 2.x), w którym muszę użyć innej biblioteki, która jest zależna od klienta koszulki od 1.x i I ' Mam problemy z uzyskaniem obu, aby współistnieć w ścieżce klas. Wygląda na to, że HK2 znajduje coś, co implementuje dostawców z javax.ws.rs. * I próbuje je utworzyć. Gdy jest to klasa z Jersey 1.x, wtrysk zależność, że musi tam nie ma, a ja w końcu z dużą ilością błędów, takich jak:Pierwsze Jersey 1.x i 2.x do współistnienia

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) 

Czy istnieje jakiś sposób, aby uzyskać Jersey 2.x/HK2 do zignorować wszystko w przestrzeni pakietu com.sun.jersey. *

Odpowiedz

10

Wygląda na to, że domyślne zachowanie org.glassfish.jersey.internal.ServiceFinder polega na znajdowaniu implementacji usług za pośrednictwem usługi META-INF/services w ścieżce klas. Ma jednak metodę setIteratorProvider, która umożliwia ustawienie alternatywnej implementacji ServiceIteratorProvider. Udało mi się rozwiązać ten problem poprzez nadanie jej implementację który odfiltrowuje wszelkie nazwy klas z 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

Jak udało ci się uzyskać instancję ServiceFinder? – badunk

+0

W moim zastąpieniu io.dropwizard.Application # initialize Dodałem to: ServiceFinder.setIteratorProvider (new Jersey2ServiceIteratorProvider()); –