java.lang.ClassCastException with the same class object

后端 未结 3 1362
小鲜肉
小鲜肉 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: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.

提交回复
热议问题