完全相同的类的ClassCastException

时间:2014-01-16 17:34:05

标签: java java-ee netbeans

我正在运行数据库查询并尝试将结果转换为Customer对象,但我收到错误消息:

java.lang.ClassCastException: Entities.Customer cannot be cast to Entities.Customer

我的代码:

Customer c = (Customer)em.createNamedQuery("Customer.findByEmail")
        .setParameter("email", user)
        .getSingleResult();

我读过这是因为类加载器,但说实话,这有点过头了。在其他地方是否有一个巨大的问题,或者我只是错误地投了它?

3 个答案:

答案 0 :(得分:1)

看起来你有两个ClassLoaders。您可以使用

检查类加载器
Customer.class.getClassLoader();

em.createNamedQuery("Customer.findByEmail").setParameter("email", user).getSingleResult().getClass().getClassLoader();

然后您可以尝试查找更多信息。

答案 1 :(得分:0)

如果您有选择,我建议您使用JPA 2.0并使用:

<T> TypedQuery<T> createNamedQuery(java.lang.String name,
                               java.lang.Class<T> resultClass)

我认为它应该避免类强制转换异常。

答案 2 :(得分:0)

就像allprog所说的那样,因为给你回复的类来自与你的webapp不同的jar(我假设你正在使用webapp)。

在运行时,来自一个jar(或您的应用程序)的类加载器加载的Customer将从另一个jar(或app)转换为客户。

如此不同的可能性:

  1. “Customer”的版本不同,classLoader相同
  2. 或两个客户是相同的,并且类加载器不同。
  3. 在这两种情况下,您都会遇到同样的错误。

    您可以尝试使用javap反编译您的类,看看会发生什么。

    如果您想了解更多关于classLoading的信息: http://zeroturnaround.com/rebellabs/video-do-you-really-get-class-loaders-a-jazoon-talk-by-jevgeni-kabanov/