Java 使用JDO持久化/检索对象时DataNucleus DAO对象中的ClassCastException

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

我已经使用Spring和Jetty创建了一个简单的webapp,并且正在使用DataNucleus和DB4O创建hello world JDO测试

我可以持久化一个类没有问题,但是当我去查询该类时,我得到一个
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应用程序类加载器)下定义其他组件。你应该把它贴出来作为答案。