2017-05-09 2 views
0

이 코드 조각은 나를 자극하고, 가끔은 작동하지 않으며 다른 시간은 그렇지 않습니다! 동일한 클래스 객체를 가진 java.lang.ClassCastException

NamedQuery :

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; 
     } 
    } 

오류가 나를 미치게합니다 (이름 = "User.findByLogin", 쿼리 = "로그인 유 WHERE u.login = 사용자로부터 U에게 선택") !

Avertissement : EJB5184 : 공중 dz.admin.entity.User dz.admin.service.UserFacade.findByLogin (java.lang.String의) Avertissement : 시스템 예외는 EJB UserFacade, 메소드 호출시에 발생 javax.ejb.EJBException .... 발생 원인 : java.lang.ClassCastException : dz.elit.admin.entity.User는 dz.elit.admin.entity.User (dz.elit.admin)에 캐스팅 할 수 없습니다. service.UserFacade.findByLogin (UserFacade.java:45)

답변

2

내 생각에 다른 클래스 로더가있는 것 같습니다. 다른 클래스 로더에로드 된 동일한 클래스는 여전히 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!"); 
     } 
    } 
} 

물론 그것은 내가 전에 질문 관련 질문에 대한 몇 가지 포인터를 제공 할 수 있습니다, 당신이 시작할 수 있도록 ... 당신의 설정의 나머지 부분에 따라 달라집니다. 어쩌면 해답의 일부가 당신에게 도움이 될 수 있습니다

는 제안 된 솔루션의 일부는을 사용하여, 당신의 클래스 로더의 설정을 변경 포함 공통 인터페이스, 또는 객체 직렬화/직렬화 해제.

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

아마도 사용자가 실제로 존재하는지 (null이 아님) 확인해야합니다. 언젠가는 null가됩니다 그리고 당신은 다시 참조해야합니다 그것이

때때로 작업과 다른 시간이되지 않습니다!

관련 문제