【问题标题】:java.lang.ClassCastException with the same class object具有相同类对象的 java.lang.ClassCastException
【发布时间】:2017-10-07 11:53:49
【问题描述】:

这段代码让我很生气, 有时它工作,有时它没有!

NamedQuery : (name = "User.findByLogin", query = "SELECT u FROM User u WHERE u.login = :login")

public User findByLogin(String login) {
        Query query = em.createNamedQuery("User.findByLogin");
        query.setParameter("login", login);
        try {
            return (User) query.getSingleResult();
        } catch (javax.persistence.NoResultException ex) {
            return null;
        }
    }

这个错误让我抓狂!

声明:EJB5184:调用 EJB UserFacade 时发生系统异常,方法:public dz.admin.entity.User dz.admin.service.UserFacade.findByLogin(java.lang.String ) 声明:javax.ejb.EJBException .... 原因:java.lang.ClassCastException:dz.elit.admin.entity.User 无法在 dz.elit.admin.service 中强制转换为 dz.elit.admin.entity.User .UserFacade.findByLogin(UserFacade.java:45)

【问题讨论】:

    标签: ejb-3.0 jpql classcastexception stateless-session-bean


    【解决方案1】:

    我的猜测是你有不同的类加载器。在不同的类加载器中加载的同一个类仍然被 JVM 认为是不同的。

    要验证这一点,您可以尝试捕获异常并打印/记录类加载器。

    public User findByLogin(String login) {
        Query query = em.createNamedQuery("User.findByLogin");
        query.setParameter("login", login);
        Object result = null;
        try {
            result = query.getSingleResult();
            return (User) result ;
        } catch (javax.persistence.NoResultException ex) {
            return null;
        } catch (ClassCastException ex) {
            logger.info("Object classloader: " + result.getClass().getClassLoader());
            logger.info("Target class classloader: " + User.class.getClassLoader());
            if(result.getClass().getClassLoader() != User.class.getClassLoader()) {
                logger.warn("Different classloaders detected!");
            }
        }
    }
    

    至于解决方案,这当然取决于您的其余设置...为了帮助您入门,我可以为您提供一些关于之前提出的相关问题的提示。也许那里的一些答案会对您有所帮助:

    一些建议的解决方案包括更改您的类加载器设置、使用通用接口或序列化/反序列化您的对象。

    【讨论】:

      【解决方案2】:
      Query query = em.createNamedQuery("User.findByLogin");
      ...
      return (User) query.getSingleResult();
      

      您可能需要检查用户是否真的存在(不为空)。 有时它会为空,您需要重新引用它

      有时有效,有时无效!

      【讨论】:

        【解决方案3】:

        我在我的 spring-boot 应用程序中遇到了同样的问题,浪费了我这么多时间来解决它。

        问题是由于类加载器而产生的。

        Model类和Session类的类加载器不同。

        System.out.println("ClassLoader : " + Employee.class.getClassLoader());
        System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
        
        ClassLoader : org.springframework.boot.devtools.restart.classloader.RestartClassLoader@a3af3c
        sun.misc.Launcher$AppClassLoader@1d16e93
        

        由于这种依赖关系,我遇到了这个问题。

        <dependency>
          <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        

        当我对此发表评论时,我的代码工作正常,所以我建议你检查你的 jars。

        System.out.println("ClassLoader : " + Employee.class.getClassLoader());
        System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
        
        ClassLoader : sun.misc.Launcher$AppClassLoader@1d16e93
        sun.misc.Launcher$AppClassLoader@1d16e93
        

        希望这个答案对你有所帮助。

        【讨论】:

        • 谢谢!你拯救了我的夜晚。我用 devtools 在 Spring Boot 中花了大约 3 个小时调试这个问题。
        • 我的晚上也是 :-)。非常有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        相关资源
        最近更新 更多