具有相同类对象的java.lang.ClassCastException

bil*_*tch 1 stateless-session-bean classcastexception jpql ejb-3.0

这段代码使我感到恼火,有时它起作用,而另一些时候却不起作用!

NamedQuery :(名称=“ User.findByLogin”,查询=“从用户u在哪里选择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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误使我发疯!

Avertissement:EJB5184:在EJB UserFacade上调用期间发生系统异常,方法:public dz.admin.entity.User dz.admin.service.UserFacade.findByLogin(java.lang.String)Avertissement:javax.ejb.EJBException .. .. 由以下原因引起:java.lang.ClassCastException:dz.elit.admin.entity.User无法转换为dz.elit.admin.service.UserFacade.findByLogin(UserFacade.java: 45)

Par*_*tel 15

我在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
Run Code Online (Sandbox Code Playgroud)

由于这种依赖性,我面临这个问题。

<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)

当我对此发表评论时,我的代码工作正常,所以我建议您检查一下您的罐子。

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
Run Code Online (Sandbox Code Playgroud)

希望这个回答对你有帮助。


bra*_*n99 5

我的猜测是您有不同的类加载器。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!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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