代码之家  ›  专栏  ›  技术社区  ›  David Parks

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

  •  4
  • David Parks  · 技术社区  · 14 年前

    我正在创建MVC Spring webapp。 使用:jetty(servlet容器)、datanucleus(DAO平台)、db4o(嵌入式数据存储)。

    当我使用DataNucleus中的JDO持久化一个对象(在Spring控制器中完成)时,它会存储到DBFine中。

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

    当我对以前添加的对象进行简单查询时,我会得到一个 ClassCastException 在我的测试课上(不能 a.b.c.Test 交流试验 )

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

    我已经走了这么远,但我真的不知道如何处理这样的类加载器问题,我以前从未在类加载器上花过很多心思。任何方向都是有用的。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Péter Török    14 年前

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

    不幸的是,我不熟悉您使用的平台,所以我不能给出比这更具体的建议:尝试移动包含您的 Test 类到Web应用程序类路径上的不同位置,和/或重新配置Spring和Jetty类加载器,以便两者都委托加载 试验 到同一个父类加载器。

        2
  •  2
  •   Stephen C    14 年前

    我认为你的问题可能和上面描述的类似 here

    如果是这样,解决方法似乎是确保JDO JAR文件由类加载器的共同祖先加载。