2011-03-17 14 views
8

Estoy intentando obtener un archivo WAR para ejecutar dentro de un contenedor Karaf OSGi. La aplicación se ejecuta correctamente en el embarcadero independiente 6.1.26, pero cuando la aplicación se ejecuta dentro de Karaf, me sale el siguiente excepción y la instancia Karaf congela:Cómo obtener Spring JPA, Hibernate y OSGi para jugar bien?

WARN org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find 
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null 

Tenga en cuenta que la aplicación no se basa en hibernación en un paquete OSGi separado; incluye los contenedores de hibernación en WEB-INF/lib.

He examinado la información en esta publicación: Equinox (OSGi) and JPA/Hibernate - Finding Entities. Sin embargo, la aplicación está utilizando JPA, en lugar de usar Hibernate directamente. La configuración de la aplicación es muy similar a la segunda opción que se encuentra en esta publicación: Difference between configuring data source in persistence.xml and in spring configuration files. Como tal, no tengo un control en una SessionFactory de Hibernate que me permita establecer la propiedad anotatedClasses.

¿Alguna idea sobre cómo pasar la excepción?

Respuesta

4

He trabajado en paralelo con el autor y voy a publicar nuestra solución aquí para cualquier persona que se encuentre con esto en el futuro.

La excepción se produce porque Hibernate intenta descomprimir su jar para buscar las clases de persistencia. Como mencionan otras publicaciones, OSGi no permite que Hibernate actúe como un cargador de clases, así que esto falla. La solución estaba especificando todas las clases que necesitaba para cargar a mano y luego diciéndole que no intentara cargar nada más.

Utilizamos un archivo persistence.xml y un archivo orm.xml (utilizamos nombres predeterminados por lo que no tuvimos que especificar tampoco en nuestro applicationContext.xml).

Nuestro archivo persistence.xml simplemente apuntaba al orm.xml usando la etiqueta <mapping-file>. También incluyó la etiqueta <exclude-unlisted-classes/> para evitar que hibernate intente cargar clases adicionales.

Nuestro archivo orm.xml usó <entity class="path.to.my.class" metadata-complete="false"/> para llamar a cada clase de entidad que necesitábamos cargar. La parte metadata-complete le dice a hibernate que use las anotaciones encontradas en la clase para completar la configuración.

+1

Para ver un ejemplo de un archivo Spring JPA persistence.xml, consulte [Sección 12.6.1.3 del Manual de referencia de Spring Framework] (http://static.springsource.org/spring/docs/2.5.x/reference/ orm.html). Para esta solución, el archivo orm.xml incluía solo el elemento '' y un elemento anidado '' con el nombre de clase completo de cada clase que contiene anotaciones @Entity. El atributo 'metadata-complete =" false "' le dice a hibernate que lea todos los datos que no están especificados en el archivo orm.xml (todo, en este caso) a partir de las anotaciones especificadas en la clase. – Adam

Cuestiones relacionadas