2012-09-03 3 views
5

Ich muss einen REST-Client in eine vorhandene OSGi-Anwendung integrieren, die mit Apache Felix implementiert wurde. Der REST-Dienst basiert auf der RESTeasy-Implementierung (Version 2.3.2.Final) von JAX-RS. Ich habe ein separates Paket mit den Abhängigkeiten der Clients erstellt, die erforderlichen RESTeasy-Pakete exportiert und in das Bundle importiert, in dem der Client verwendet wird, aber leider kann ich nicht innerhalb des OSGi-Kontexts arbeiten.REST-Client innerhalb der OSGi-Anwendung

Ich habe zwei verschiedene Ansätze ausprobiert. Zunächst man die generische ClientRequest mit:

ClientRequest request = new ClientRequest(MyService.URL_TEST+"/stats"); 
request.body(javax.ws.rs.core.MediaType.APPLICATION_XML, stats); 
ClientResponse<String> response = request.post(String.class); 

Der Fehler, den ich in diesem Fall erhalten, ist ziemlich seltsam:

[java] java.lang.RuntimeException: java.lang.ClassCastException: 
org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor cannot be cast to 
org.jboss.resteasy.client.ClientExecutor 

, wo ich es sicher bekannt ist, dass ApacheHttpClient4Executor die ClientExecutor-Schnittstelle implementiert.

Wenn ich versuche, meine eigenen REST-Client-Wrapper um Resteasy wie folgt zu verwenden:

MyService myService = MyServiceClient.getInstance(); 
myService.saveStatistics(stats); 

ich eine andere Ausnahme erhalten:

[java] java.lang.LinkageError: ClassCastException: attempting to 
castjar:file:/D:/Development/Eclipses/eclipse_4.2_j2ee_x64/lib/jaxrs-api-2.3.2.Final.jar 
!/javax/ws/rs/ext/RuntimeDelegate.classtobundle: 
//78.0:1/javax/ws/rs/ext/RuntimeDelegate.class 

Soweit ich verstehe, hat die LinkageError höchstwahrscheinlich zu tun mit der Art und Weise, wie RESTeasy RuntimeDelegate mit Hilfe einiger Classloader-Tricks initialisiert, die wahrscheinlich unter die Einschränkungen des OSGi-Frameworks fallen. Ich habe den Verdacht, dass die erwähnte java.lang.ClassCastException dieselbe Quelle hat.

Gibt es eine Möglichkeit, RESTeasy in OSGi zu verwenden?

PS: Diskussion über ein ähnliches Problem mit Resteasy, aber außerhalb von OSGi: java.lang.LinkageError: ClassCastException

Update: das sind die Bibliotheken in restclient Bundle enthalten: Aktivierung-1.1.jar commons-codec- 1.2.jar commons-httpclient-3.1.jar commons-io-2.1.jar Commons-Protokollierung-1.0.4.jar flexjson-2.1.jar httpclient-4.1.2.jar httpcore-4.1.2.jar javassist-3.12.1 .ga.jar jaxb-api-2.2.3.jar jaxb-impl-2.2.4.jar jaxrs-api-2.3.2.Finale.jar jcip-annotations-1.0.jar jettison-1.3.1.jar jsr250-api -1.0.jar junit-4.10.jar log4j-1.2.14.jar resteasy-jaxb-provider-2.3.2.Final.jar resteasy-jaxrs- 2.3.2.Final.jar resteasy-jettison-provider-2.3.2.Final.jar scannotation-1.0.3.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar myservice-common-0.1 .0.3.jar my-service-client-0.1.0.3-SNAPSHOT.jar stax-api-1.0-2.jar xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar xstream-1.4.2.jar

Dies sind die Exporte aus dem Restclient-Bundle: javax.ws.rs, javax.ws.rs.ext, javax.ws.rs.core, org.jboss.resteasy.client, org.jboss.restasy.client. cache, org.jboss.resteasy.client.extraktoren, org.jboss.resteasy.client.marshallers, org.jboss.restasy.client.core.executors, javax.xml.bind.annotation, org.jboss.resteasy.plugins. Anbieter, org.jboss.resteasy.plugins.providers.jaxb, org.jboss.resteasy.spi

+0

Welche Gläser sind in Ihrem Kundenpaket enthalten? – jtahlborn

+0

die bisher: myservice-client-0.1.0.3-SNAPSHOT.jar myservice-common-0.1.0.3.jar junit-4.10.jar Javassist-3.12.1.GA.jar jcip-Annotationen-1.0.jar jsr250-api-1.0.jar Resteasy-jaxrs-2.3.2.Final.jar jaxrs-api-2.3.2.Final.jar aktivierungs 1.1.jar commons-Httpclient-3.1.jar –

+0

Und innerhalb von mein restclient bundle Ich habe versucht, javax.ws.rs, javax.ws.rs.ext, javax.ws.rs.core, org.jboss.resteasy.client, org.jboss.resteasy.client.core zu exportieren .executors abgesehen von meinen eigenen Klassen von myservice-common –

Antwort

0

Werfen Sie einen Blick auf die SpringSource Bundle Repo, hat es einige sehr nützliche vordefinierte Bundles von allgemeinen Bibliotheken einschließlich der Apache HTTP Client, die wir (in Verbindung mit gson) verwenden, um unsere RESTful comms zu tun.

+0

Danke für den Tipp. Ich war gerade dabei, die Frage zu stellen und habe es gerade nochmal überprüft - leider gibt es kein RESeasyBündel. Und das eigentliche Problem ist in der Tat, dass RESTeasy einige Klassen zur Laufzeit bei der Verwendung von Proxies namentlich verwendet. Dies führt zu zwei Versionen derselben Klasse - eine wird vom OSGi-Kontext und die andere von RESeasy selbst geladen. –

0

(leider ein altes Modul meines Projekts verwendet immer noch OSGi, aber mit RESTEasy 3.0.16 jetzt) ​​

Wenn ich eine Abhängigkeit OSGify meine bevorzugte Lösung ist jetzt, es mit der ausgezeichneten Apache Ops4j Pax Tipi project zu wickeln. Das Projekt stellt ein vorkonfiguriertes Maven-Setup zur Verfügung (das POM übernimmt die Bündelung) und Sie müssen lediglich die GAV-Koordinaten des ursprünglichen Projekts in einem Tipi-Submodul mit einem org.apache.ops4j.pax.tipi Präfix anpassen und das neue Bundle-Projekt erstellen, das den ursprüngliche Abhängigkeit, entpackt und verpackt es als OSGi-Bundle.

Sie können von einem bestehenden Tipi-Unterprojekt starten, das am besten zu Ihrem Projektaufbau passt (Abhängigkeiten usw.) und OSGi-Importe/Exporte anpassen (meistens werden diese automatisch vom Maven-Bundle-Plugin erstellt) .

Dies funktionierte ziemlich gut für mich, solange das ursprüngliche Projekt nicht zu viele exotische oder fehlerhafte Abhängigkeiten enthielt.

Allerdings können Sie in Stolperfallen wie transitive dependencies using the root package laufen, wie ich derzeit erleben, die ein echter Showstopper sein kann (herauszufinden, welche Bibliothek ein echter Albtraum ist).

Leider scheint Resteasy davon betroffen werden, da ich genau den gleichen Fehler (Standard-Paket erhalten, auch nach nicht-Test und nicht vorgesehen Abhängigkeiten als optional deklarieren:

Das Standardpaket‘. 'wird nicht durch die Import-Package Syntax erlaubt

Upgrade die maven-Bundle-Plugin auf die neueste Version 3.0.1 ergibt einen anderen Fehler (noch weniger hilfreich.):

[ERROR] Bündel org.ops4j.pax.tipi: org.ops4j.pax.tipi.resteasy-jaxrs: Bündel: 3.0.16.Final.1: Der Name des Pakets kann nicht aus dem systemeigenen Code des Pakets analysiert werden: [ERROR] Error (s) im Bündelkonfiguration gefunden

aktualisieren scheint durch upping Tipi-Version in POM 1.4.0 Prüfung gelöst zu werden ...

0

Ist Resteasy obligatorisch? Ich persönlich benutze jersey in OSGi und es funktioniert perfekt, sowohl als Client und Server.

Verwandte Themen