2010-10-25 61 views
4

我已經使用Spring創建了一個簡單的webapp & Jetty,並且正在使用DataNucleus創建一個hello world JDO測試& DB4O。使用JDO持久/檢索對象時DataNucleus DAO對象中的ClassCastException

我可以堅持班級沒問題,但是當我去查詢班級時我得到ClassCastException,不能投a.b.c.MyClassa.b.c.MyClass

當我檢查我創建的原始對象的類加載器時,它是[[email protected]],它自然是彈出WebApp類加載器。

我在同一個servlet方法中執行持久操作和查詢操作時,當我用DB從一個簡單的查詢中重新讀取對象時,我從DB獲取一組abcMyClass對象,但是類加載器是[[email protected]],因此是例外。

繼DataNucleus將文檔這裏http://www.datanucleus.org/extensions/classloader_resolver.html

...的JDO2類加載機制 利用3類加載器
*當創建一個PersistenceManagerFactory,你可以 指定一個類加載器。如果指定,則首先使用
*要嘗試的第二個類加載器是當前的 線程的類加載器。
*要嘗試的第三個類加載器是PMF上下文的類加載器。

我介紹介紹的前兩個選項,並驗證類加載器與在servlet這些調試步驟了Servlet的WebAppClassLoader

Thread.currentThread().getContextClassLoader().toString() 
((JDOPersistenceManagerFactory)pm.getPersistenceManagerFactory()).getPrimaryClassLoader().toString() 

兩個產生[[email protected]]的類加載器。

我不知道我在哪裏錯了。

+0

你是否檢查過對象的類加載器和類中的類? object.getClass()。getClassLoader()。等於(MyClass.class.getClassLoader())?這樣的例外是99%的類加載器問題。 – Gamlor 2010-10-25 14:31:17

+0

我想我現在看到它了。這是一個Jetty/Spring問題,Spring允許我在應用程序上下文(系統類加載器)和servlet上下文(jetty提供的Web應用程序類加載器)中定義一些組件。您應該將其作爲答案發布。 – 2010-10-25 14:56:29

回答

1

我作爲一個答案先前的評論:

此異常指示它是一個類加載器的問題。比較對象的類加載器和您用於演員的類。

ClassLoader loaderOfObject = theObject.getClass().getClassLoader(); 
ClassLoader loaderOfLocalClass = MyClass.getClassLoader(); 
// have to be the same. 
assert loaderOfObject.equals(loaderOfLocalClass); 

btw:如果db4o使用錯誤的類加載器。你可以通過顯式配置類加載器來改變它。

EmbeddedConfiguration configuration = Db4oEmbedded.newConfiguration(); 
    JdkReflector reflector = new JdkReflector(Thread.currentThread().getContextClassLoader()); 
    configuration.common().reflectWith(reflector); 
    ObjectContainer container = Db4oEmbedded.openFile(configuration, "database.db4o"); 

當一個類加載器是不夠的:您也可以通過JdkLoader,而不是一個類加載器db4o的接口的實例。在那裏你可以實現任何類查找方法。例如查找多個類加載器。