gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:54 25 4
gpt4 key购买 nike

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

我可以保留一个类没问题,但是当我查询该类时,我得到一个 ClassCastException,无法将 a.b.c.MyClass 转换为 a.b.c。我的类(class)

当我检查我创建的原始对象的类加载器时,它是 [WebAppClassLoader@1592226291],自然是 springs WebApp 类加载器。

我在同一个 servlet 方法中执行持久化操作和查询操作,当我用一个简单的查询从数据库中重新读取对象时,我从数据库中取回了一组 a.b.c.MyClass 对象,但是类加载器是[sun.misc.Launcher$AppClassLoader@5acac268],因此异常(exception)。

在此处遵循 DataNucleus 文档 http://www.datanucleus.org/extensions/classloader_resolver.html

...the JDO2 class-loading mechanism utilises 3 class loaders
* When creating the PersistenceManagerFactory you can specify a class loader. This is used first if specified
* The second class loader to try is the class loader for the current thread.
* The third class loader to try is the class loader for the PMF context.

我介绍了记录的前两个选项,并通过 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 接口(interface) JdkLoader 的实例而不是类加载器。在那里你可以实现任何类查找方法。例如在多个类加载器中查找。

关于java - 使用 JDO 持久化/检索对象时 DataNucleus DAO 对象中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com