2017-05-09 143 views
0

這段代碼讓我感到不快, 有時會起作用,有些時候它不起作用!具有相同類對象的java.lang.ClassCastException

的NamedQuery:(NAME = 「User.findByLogin」,查詢= 「選擇[u] 從用戶U WHERE u.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; 
     } 
    } 

的錯誤讓我瘋了!公共dz.admin.entity.User dz.admin.service.UserFacade.findByLogin(java.lang.String中) Avertissement:上EJB UserFacade,方法調用期間發生系統異常:

Avertissement:EJB5184: javax.ejb.EJBException .... 引起:java.lang.ClassCastException:無法將dz.elit.admin.entity.User轉換爲dz.elit.admin.entity.User at 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(); 

可能您需要檢查用戶是否真的存在(非空)。 有時它將是空的,你將需要重新參考它

有時它工作,而有些時候它不會!

相關問題