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

时间:2010-10-25 08:49:14

标签: java spring spring-mvc classloader jdo

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

当我使用DataNucleus中的JDO持久保存一个对象(在Spring Controller中完成)时,它会存储到数据库中。

@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]

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

2 个答案:

答案 0 :(得分:4)

要显示类强制转换异常,不需要有两个不同版本的类。 当由两个不同的类加载器加载时,即使是相同的类定义也被视为两个不同的类。这里的情况似乎就是这样。

不幸的是,我对您使用的平台并不熟悉,因此我无法提供比这更具体的建议:尝试将包含Test类的jar移动到Web应用程序类路径上的不同位置,和/或重新配置Spring和Jetty类加载器,以便将Test的加载委托给同一个父类加载器。

答案 1 :(得分:2)

我认为您的问题可能类似于here所描述的问题。

如果是这样,治愈似乎是为了确保jdo jar文件由类加载器的共同祖先加载。