java.lang.ClassCastException with the same class object

后端 未结 3 1335
小鲜肉
小鲜肉 2020-12-21 22:45

This piece of code irritates me, sometimes it working and some other times it doesn\'t !

The NamedQuery : (name = \"User.findByLogin\", query = \"SEL

相关标签:
3条回答
  • 2020-12-21 22:52

    I face same issue in my spring-boot application and waste my so much time to solve it.

    Issue is generate because of classloaders.

    Classloaders of Model class and Session class both are different.

    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
    

    I face this issue because of this dependency.

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

    When i comment this then my code working fine, so i suggest you to please check your 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
    

    Hope this answer help you.

    0 讨论(0)
  • 2020-12-21 22:54

    My guess would be that you have different classloaders. The same class loaded in a different classloader is still considered different by the JVM.

    To verify this, you could try to catch the exception and print/log the classloaders.

    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!");
            }
        }
    }
    

    As for the solution, that of course depends on the rest of your setup... To get you started, I can give you some pointers to related questions asked before. Maybe some of the answers there can be helpful to you:

    • Solution for the ClassCastException due to ClassLoader issue
    • ClassCastException because of classloaders?
    • cast across classloader?
    • ClassCastException when casting to the same class

    Some of the suggested solutions include changing your classloader setup, using a common interface, or serializing/deserializing your object.

    0 讨论(0)
  • 2020-12-21 23:06
    Query query = em.createNamedQuery("User.findByLogin");
    ...
    return (User) query.getSingleResult();
    

    Probably you will need to check whether User really exist (not null). sometime it will be null and you will need to re-refer it

    sometimes it working and some other times it doesn't !

    0 讨论(0)
提交回复
热议问题