java – 通过Spring持久化数据时,不同的类加载器会导致ClassCastException

我正在创建一个MVC Spring webapp.
使用:Jetty(servlet容器),DataNucleus(dao平台),DB4O(嵌入式数据存储).

当我使用DataNucleus中的JDO持久保存一个对象(在Spring Controller中完成)时,它可以很好地存储到DB中.

@PersistenceCapable
public class Test {
    @Persistent
    private String testString;
    //getter-setters implemented
}

当我对我之前添加的对象进行简单查询时,我的Test类上出现了ClassCastException(无法将a.b.c.Test转换为a.b.c.Test).

JDO返回的Test的类加载器是(toString)[sun.misc.Launcher$AppClassLoader@5acac268],在我将它持久保存到数据库之前,Test类的类加载器是[WebAppClassLoader @ 1593275665]

我已经走到了这一步,但我真的不知道如何处理这样的类加载器问题,我以前从未在类加载器上花太多时间考虑过.任何方向都有帮助.

最佳答案
对于要出现的类强制转换异常,不需要有两个不同版本的类.当由两个不同的类加载器加载时,即使相同的类定义也被视为两个不同的类.这似乎就是这种情况.

不幸的是我对你使用的平台并不熟悉,所以我不能提供比这更具体的建议:尝试将包含Test类的jar移动到web app类路径上的不同位置,和/或重新配置Spring和Jetty类加载器,以便将Test的加载委托给同一个父类加载器.

转载注明原文:java – 通过Spring持久化数据时,不同的类加载器会导致ClassCastException - 代码日志