2017-05-09 5 views
0

Ce morceau de code m'énerve, parfois ça marche et d'autres fois ça ne fonctionne pas!java.lang.ClassCastException avec le même objet de classe

Le NamedQuery: (name = "User.findByLogin", requête = "SELECT u de l'utilisateur u OÙ 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; 
     } 
    } 

L'erreur me rend fou !

Avertissement: EJB5184: Une exception du système est survenu lors d'un appel sur EJB UserFacade, méthode: dz.admin.entity.User publique dz.admin.service.UserFacade.findByLogin (java.lang.String) Avertissement: javax.ejb.EJBException .... Causé par: java.lang.ClassCastException: dz.elit.admin.entity.User ne peut pas être converti en dz.elit.admin.entity.User at dz.elit.admin. service.UserFacade.findByLogin (UserFacade.java:45)

Répondre

2

Je suppose que vous avez différents classloaders. La même classe chargée dans un classloader différent est toujours considérée comme différente par la JVM.

Pour vérifier cela, vous pouvez essayer d'intercepter l'exception et d'imprimer/enregistrer les 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!"); 
     } 
    } 
} 

Quant à la solution, qui dépend bien sûr du reste de votre configuration ... Pour commencer, je peux vous donner quelques conseils aux questions posées à ce sujet avant. Peut-être quelques-unes des réponses, il peut vous être utile:

Certaines des solutions proposées comprennent la modification de votre configuration classloader, en utilisant un interface commune, ou sérialiser/désérialiser votre objet.

0
Query query = em.createNamedQuery("User.findByLogin"); 
... 
return (User) query.getSingleResult(); 

Probablement vous devez vérifier si l'utilisateur existe vraiment (non null). parfois il sera nul et vous aurez besoin de re-référer

parfois cela fonctionne et d'autres fois il ne fonctionne pas!