2011-03-17 14 views
8

我試圖讓一個WAR文件在Karaf OSGi容器內運行。該應用程序正常運行在單機碼頭6.1.26,但是當應用程序Karaf內運行,我得到下面的異常和Karaf實例凍結:如何讓Spring JPA,Hibernate和OSGi發揮出色?

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

注意,應用程序不依賴於休眠在單獨的OSGi包中;它包含了WEB-INF/lib中的hibernate jar。

我檢查了這篇文章上的信息:Equinox (OSGi) and JPA/Hibernate - Finding Entities。但是,應用程序正在使用JPA,而不是直接使用Hibernate。應用程序的配置非常類似於本文中的第二個選項:Difference between configuring data source in persistence.xml and in spring configuration files。因此,我沒有Hibernate SessionFactory的句柄,它允許我設置annotatedClasses屬性。

有關如何克服異常的想法?

回答

4

我與作者並行工作,我將在此發佈我們的解決方案,以供將來遇到此問題的任何人使用。

由於Hibernate嘗試解壓縮它的jar以查找持久性類,因此引發了異常。正如其他帖子所提到的,OSGi不允許Hibernate像類加載器那樣工作,所以這會失敗。解決方案是指定需要手動加載的所有類,然後告訴它不要嘗試加載任何其他類。

我們使用了persistence.xml文件和文件orm.xml(我們使用默認的名稱,所以我們沒有指定無論是在我們的applicationContext.xml)。

我們的persistence.xml文件只是使用<mapping-file>標記指向orm.xml。它還包含<exclude-unlisted-classes/>標籤,以防止Hibernate嘗試加載其他類。

我們的orm.xml文件使用<entity class="path.to.my.class" metadata-complete="false"/>來調出我們需要加載的每個實體類。 metadata-complete部分告訴hibernate使用類中找到的註釋來完成配置。

+1

有關Spring JPA persistence.xml文件的示例,請參見[Spring Framework參考手冊的第12.6.1.3節](http://static.springsource.org/spring/docs/2.5.x/reference/ orm.html)。對於這個解決方案,orm.xml文件只包含''元素和一個嵌套的''元素,每個類的完全限定類名包含@Entity註釋。 metadata-complete =「false」屬性告訴hibernate從類iteself中指定的註釋中讀取orm.xml文件中未指定的所有數據(在本例中爲所有內容)。 – Adam 2011-03-18 00:59:49

相關問題