我已經使用Spring創建了一個簡單的webapp & Jetty,並且正在使用DataNucleus創建一個hello world JDO測試& DB4O。使用JDO持久/檢索對象時DataNucleus DAO對象中的ClassCastException
我可以堅持班級沒問題,但是當我去查詢班級時我得到ClassCastException
,不能投a.b.c.MyClass
到a.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]]
的類加載器。
我不知道我在哪裏錯了。
你是否檢查過對象的類加載器和類中的類? object.getClass()。getClassLoader()。等於(MyClass.class.getClassLoader())?這樣的例外是99%的類加載器問題。 – Gamlor 2010-10-25 14:31:17
我想我現在看到它了。這是一個Jetty/Spring問題,Spring允許我在應用程序上下文(系統類加載器)和servlet上下文(jetty提供的Web應用程序類加載器)中定義一些組件。您應該將其作爲答案發布。 – 2010-10-25 14:56:29