Java ClassCastException来自完全相同的类

Java ClassCastException来自完全相同的类,java,jakarta-ee,netbeans,Java,Jakarta Ee,Netbeans,我正在运行一个数据库查询,并试图将结果强制转换为客户对象,但我收到一个错误,错误是: java.lang.ClassCastException: Entities.Customer cannot be cast to Entities.Customer 我的代码: Customer c = (Customer)em.createNamedQuery("Customer.findByEmail") .setParameter("email", user) .get

我正在运行一个数据库查询,并试图将结果强制转换为客户对象,但我收到一个错误,错误是:

java.lang.ClassCastException: Entities.Customer cannot be cast to Entities.Customer
我的代码:

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

我已经读到这是由于类加载器,但老实说,这有点超出我的头脑。是否在其他地方存在重大问题,或者我只是错误地进行了铸造?

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

<T> TypedQuery<T> createNamedQuery(java.lang.String name,
                               java.lang.Class<T> resultClass)
TypedQuery createNamedQuery(java.lang.String名称,
java.lang.Class结果类)

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

就像allprog所说的,这是因为返回给您的类来自与您的Web应用程序不同的jar(我假设您正在使用Web应用程序)

在运行时,类加载器从一个jar(或应用程序)加载的客户将从另一个jar(或应用程序)转换到该客户中

所以不同的可能性:

  • 要么“客户”的版本不同,要么类加载器相同
  • 或者这两个客户是相同的,而类加载器是不同的
  • 在这两种情况下,您都会得到相同的错误

    您可以尝试使用javap对类进行反编译,看看会发生什么

    如果您想了解有关类加载的更多信息:

    看起来您有两个类加载器。您可以使用

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

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

    您试图转换的类可能来自不同的jar。再次检查以避免类路径中出现重复条目。如果发生这种情况,事情会变得很奇怪。你能提供一些关于这是在什么上运行的以及关于代码运行的上下文的更多信息吗?它正在本地Glassfish服务器上运行。一旦用户登录,我将尝试获取用户的详细信息,以便将其中一些与httpsession关联。您已经获得了Entities类的两个副本,使用两个不同的类加载器加载。只有当您使用某种具有自己的类路径和类装入器的工具箱时,才会发生这种情况。通常,当应用程序启动时,您可以很早在应用程序中引用问题类来规避问题<代码>Class.forName(无论什么.path.Entities)可能会这样做。如果这不起作用,你必须从你的类路径中删除这个类,然后以某种方式让(大概是Glassfish)类加载器为你加载它。这是怎么发生的?上面说类加载器是WebappClassLoader。这正常吗?哪一个?这两个WebAppClassLoader都是吗?您可以使用每个类加载器的getParent()方法查看整个层次结构。第二个是:WebappClassLoader(delegate=true),使用我得到的getParent()方法:org.glassfish.internal.api。DelegatingClassLoader@51b47feb. 和org.glassfish.internal.api。DelegatingClassLoader@232e0532The第一个类加载器是您的webapp自己的常规类加载器(每个webapp都有自己的类加载器)。第二种可能是Glassfish自己的通用型。我不知道Glassfish是如何处理这些问题的,但我在JBoss上也有同样的经历。你需要展示你是如何规划你的项目的,你有耳朵还是仅仅是一场战争,你的webapp是否有自己的lib以及它们是什么。。。