2012-09-03 19 views
5

Necesito integrar un cliente REST en una aplicación OSGi existente implementada con Apache Felix. El servicio REST se basa en la implementación RESTeasy (versión 2.3.2.Final) de JAX-RS. Creé un paquete separado con las dependencias de los clientes, exporté los paquetes RESTeasy necesarios y los importé en el paquete donde se usa el cliente, pero desafortunadamente no puedo hacerlo funcionar dentro del contexto OSGi.Cliente REST dentro de la aplicación OSGi

Intenté dos enfoques diferentes. Primero mediante el ClientRequest genérica:

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); 

El error que consigo en este caso es bastante raro:

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

donde se sabe con seguridad que implementa la interfaz ApacheHttpClient4Executor ClientExecutor.

Cuando trato de usar mi propio envoltorio cliente REST alrededor RESTeasy así:

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

me sale una excepción diferente:

[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 

Por lo que yo entiendo, el LinkageError muy probablemente tiene que ver con la forma en que RESTeasy inicializa RuntimeDelegate usando algunos trucos de cargador de clases, que probablemente caigan bajo las restricciones del marco OSGi. Tengo la sospecha de que la java.lang.ClassCastException mencionada primero tiene la misma fuente.

¿Hay alguna forma de que RESTeasy funcione dentro de OSGi?

PS: discusión acerca de un problema similar con RESTeasy, pero fuera de OSGi: java.lang.LinkageError: ClassCastException

Actualización: estas son las bibliotecas incluye en paquete restclient: de activación-1.1.jar Commons-codec- 1.2.jar commons-httpclient-3.1.jar commons-io-2.1.jar commons-logging-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.Final.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

Estas son las exportaciones del paquete del cliente reclinable: javax.ws.rs, javax.ws.rs.ext, javax.ws.rs.core, org.jboss.resteasy.client, org.jboss.resteasy.client. cache, org.jboss.resteasy.client.extractors, org.jboss.resteasy.client.marshallers, org.jboss.resteasy.client.core.executors, javax.xml.bind.annotation, org.jboss.resteasy.plugins. proveedores, org.jboss.resteasy.plugins.providers.jaxb, org.jboss.resteasy.spi

+0

¿Qué jarras están incluidas en su paquete de cliente? – jtahlborn

+0

los hasta ahora: myservice-cliente-0.1.0.3-SNAPSHOT.jar myservice-comunes-0.1.0.3.jar junit-4.10.jar javassist-3.12.1.GA.jar JCIP-anotaciones-1.0.jar jsr250-API-1.0.jar resteasy-jaxrs-2.3.2.Final.jar jaxrs-api-2.3.2.Final.jar activación de 1.1.jar Commons-httpclient-3.1.jar –

+0

Y dentro de mi paquete de repositorio He intentado exportar javax.ws.rs, javax.ws.rs.ext, javax.ws.rs.core, org.jboss.resteasy.client, org.jboss.resteasy.client.core .executores aparte de mis propias clases de myservice-common –

Respuesta

0

Echa un vistazo a SpringSource Bundle Repo, tiene algunos paquetes precompilados muy útiles de bibliotecas comunes incluyendo el Apache HTTP Client que estamos usando (junto con gson) para hacer nuestras COMUNICACIONES RESTful.

+0

Gracias por el consejo. He estado allí en el momento de hacer la pregunta y volví a consultar ahora mismo. Desafortunadamente, no hay un paquete RESTeasy. Y el problema real es que RESTeasy utiliza cierta clase cargando por nombre en tiempo de ejecución cuando usa Proxies. Esto da como resultado dos versiones de la misma clase, una cargada por el contexto OSGi y la otra por RESTeasy. –

0

(desafortunadamente, un módulo heredado de mi proyecto todavía usa OSGi, pero usa RESTeasy 3.0.16 ahora)

Cuando necesito una dependencia OSGify mi solución preferida ahora es envolver utilizando la excelente Apache Ops4j Pax Tipi project.

El proyecto proporciona una configuración preconfigurada Maven (POM padre se encarga de la agrupación) y sólo hay que adaptar el VAB las coordenadas del proyecto original en un módulo sub tipi con un prefijo org.apache.ops4j.pax.tipi y construir el nuevo proyecto conjunto que se basa en el dependencia original, desempaqueta y lo envuelve como paquete OSGi.

Puede comenzar desde un proyecto secundario Tipi existente que mejor se adapte a la configuración de su proyecto (dependencias, etc.) y adaptar cualquier importación/exportación OSGi que falte (la mayoría de las veces, se crean automáticamente mediante maven-bundle-plugin) .

Esto funcionó bastante bien para mí, siempre y cuando el proyecto original no contenía demasiadas dependencias exóticos o malformados.

Sin embargo, es posible que se encuentre con enganches como transitive dependencies using the root package, como actualmente experimento, que puede ser un verdadero obstáculo para el espectáculo (descubrir qué biblioteca es una verdadera pesadilla).

Desafortunadamente, RESTeasy parece ser afectada por esto, ya que me da exactamente el mismo error (paquete por defecto, incluso después de declarar la no-test y dependencias no ofrece como opcional:

El paquete por defecto'. 'no está permitido por la sintaxis Import-Package

Actualización del experto-haz-plugin a la última versión 3.0.1 produce un error diferente (incluso menos útil):.

[ERROR] Bundle org.ops4j.pax.tipi: org.ops4j.pax.tipi.resteasy-jaxrs: paquete: 3.0.16.Final.1: No se puede analizar el nombre de la cabecera código nativo paquete: [ERROR] Error (s) encontrados en la configuración haz

actualización parece ser resuelto por subiendo versión del tipi de POM a 1.4.0, las pruebas ...

0

Es RESTEasy obligatoria? Personalmente uso jersey en OSGi y está funcionando perfectamente, como cliente y servidor.

Cuestiones relacionadas