Java 使用JDO持久化/检索对象时DataNucleus DAO对象中的ClassCastException
我已经使用Spring和Jetty创建了一个简单的webapp,并且正在使用DataNucleus和DB4O创建hello world JDO测试 我可以持久化一个类没有问题,但是当我去查询该类时,我得到一个Java 使用JDO持久化/检索对象时DataNucleus DAO对象中的ClassCastException,java,classloader,jdo,db4o,datanucleus,Java,Classloader,Jdo,Db4o,Datanucleus,我已经使用Spring和Jetty创建了一个简单的webapp,并且正在使用DataNucleus和DB4O创建hello world JDO测试 我可以持久化一个类没有问题,但是当我去查询该类时,我得到一个ClassCastException,不能将a.b.c.MyClass强制转换为a.b.c.MyClass 当我检查我创建的原始对象的类加载器时,它是[WebAppClassLoader@1592226291],当然是springs WebApp类加载器 我在同一个servlet方法中执行p
ClassCastException
,不能将a.b.c.MyClass
强制转换为a.b.c.MyClass
当我检查我创建的原始对象的类加载器时,它是[WebAppClassLoader@1592226291]
,当然是springs WebApp类加载器
我在同一个servlet方法中执行persist操作和query操作,当我用一个简单的查询从DB中重新读取对象时,我从DB中得到一组a.b.c.MyClass对象,但是类加载器是[sun.misc.Launcher]$AppClassLoader@5acac268]
,因此例外
下面是DataNucleus文档
…JDO2类加载机制
使用3级装载机*创建PersistenceManagerFactory时,您可以 指定一个类加载器。这是用来 首先,如果指定
*要尝试的第二个类加载器是当前类的类加载器 线程。
*要尝试的第三个类加载器是PMF上下文的类加载器 我介绍了所记录的前两个选项,并通过Servlet中的以下调试步骤验证了类加载器是Servlet中的
WebAppClassLoader
:
Thread.currentThread().getContextClassLoader().toString()
((JDOPersistenceManagerFactory)pm.getPersistenceManagerFactory()).getPrimaryClassLoader().toString()
两者都产生[WebAppClassLoader@1592226291]
作为类加载器
我不确定我的错误在哪里。我先前的评论作为回答: 此异常表示这是类加载器问题。比较对象的类装入器和用于强制转换的类
ClassLoader loaderOfObject = theObject.getClass().getClassLoader();
ClassLoader loaderOfLocalClass = MyClass.getClassLoader();
// have to be the same.
assert loaderOfObject.equals(loaderOfLocalClass);
顺便说一句:如果db4o使用了错误的类加载器。您可以通过配置类加载器来改变这一点
EmbeddedConfiguration configuration = Db4oEmbedded.newConfiguration();
JdkReflector reflector = new JdkReflector(Thread.currentThread().getContextClassLoader());
configuration.common().reflectWith(reflector);
ObjectContainer container = Db4oEmbedded.openFile(configuration, "database.db4o");
当单个类加载器不够时:还可以传递db4o接口JdkLoader的实例,而不是类加载器。在那里,您可以实现任何类查找方法。例如,在多个类装入器中查找 您是否检查了cast中对象和类的类装入器?object.getClass().getClassLoader().equals(MyClass.class.getClassLoader())?这样的异常99%是类加载器问题。我想我现在看到了。这是Jetty/Spring的问题,Spring允许我在应用程序上下文(系统类加载器)下定义一些组件,在servlet上下文(Jetty提供的web应用程序类加载器)下定义其他组件。你应该把它贴出来作为答案。