/ / L'app Web Jersey in ambiente Karaf OSGI non funziona: java, osgi, jersey-2.0, karaf

L'app web Jersey in ambiente Karaf OSGI non funziona - java, osgi, jersey-2.0, karaf

Ho installato e attivato il server della maglia 2.19 bundle (e dipendenze) in Apache Karaf per creare una semplice webapp (/ tracks / get che produce una rappresentazione json di un oggetto Track con nomi semplici e campi artista).

Ho creato una versione bundle del mio file di guerra e l'ho installata in Karaf.

Quando avvio il bundle di guerra ottengo la seguente eccezione:

2016-10-14 10:35:08,299 | DEBUG | pool-4-thread-1  | FactoryFinder                    | 84 - javax.ws.rs-api - 2.0.1 | Unable to load provider class org.glassfish.jersey.server.internal.RuntimeDelegateImpl using custom classloader org.ops4j.pax.web.service.spi.util.ResourceDelegatingBundleClassLoader trying again with current classloader.
java.lang.ClassNotFoundException: org.glassfish.jersey.server.internal.RuntimeDelegateImpl
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
at org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:340)[org.eclipse.osgi-3.8.2.v20130124-134944.jar:]
at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1212)
at org.ops4j.pax.swissbox.core.BundleClassLoader.findClass(BundleClassLoader.java:176)[60:org.ops4j.pax.swissbox.core:1.7.0]
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)[:1.7.0_21]
at org.ops4j.pax.swissbox.core.BundleClassLoader.loadClass(BundleClassLoader.java:192)[60:org.ops4j.pax.swissbox.core:1.7.0]
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
at java.lang.Class.forName0(Native Method)[:1.7.0_21]
at java.lang.Class.forName(Class.java:266)[:1.7.0_21]
at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:107)[84:javax.ws.rs-api:2.0.1]
at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:166)[84:javax.ws.rs-api:2.0.1]
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:135)[84:javax.ws.rs-api:2.0.1]
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)[84:javax.ws.rs-api:2.0.1]
at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179)[84:javax.ws.rs-api:2.0.1]
at org.glassfish.jersey.server.model.IntrospectionModeller.extractMediaTypes(IntrospectionModeller.java:280)[102:org.glassfish.jersey.core.jersey-server:2.19.0]
at org.glassfish.jersey.server.model.IntrospectionModeller.extractMediaTypes(IntrospectionModeller.java:269)[102:org.glassfish.jersey.core.jersey-server:2.19.0]

che presumo sia la ragione per cui la mia webapp non funziona.

Sembra che la maglia stia ispezionando il mio annotatoclasse di servizio e ad un certo punto ha bisogno di un'istanza RuntimeDelegateImpl. Questo codice proviene dal pacchetto org.glassfish.jersey.server. La classe RuntimeDelegateImpl viene creata tramite Class.forName (). NewInstance () nel codice dal bundle javax.ws.rs.ext. Il problema principale è che il classloader del bundle javax.ws non trova org.glassfish.jersey.server.internal.RuntimeDelegateImpl nel classpath, ma non capisco come sia, dato che quella classe fa parte dell'org .glassfish.jersey.server bundle che è attivato e Export-Package: ha quel pacchetto.

risposte:

0 per risposta № 1

Non sono sicuro che la maglia funzioni fuori dalla scatola in karaf. Il modo tipico di fare REST in karaf è usare Apache CXF. CXF offre spazi dei nomi blueprint per REST e CXF-DOSGi che può esportare endpoint REST basato su servizi OSGi esportati.

Se vuoi usare la maglia allora c'è il OSGi-jaxrs connettore. Che fa una cosa simile a CXF-DOSGi.


0 per risposta № 2

Risolto il problema registrando la mia Applicazione Jersey direttamente nel servizio http osgi.