2017-05-09 14 views
0

このコードは私を苛立たせ、 時にはそれが動作していて、それ以外の時はありません!同じクラスオブジェクトを持つjava.lang.ClassCastException

NamedQuery:(名前= "User.findByLogin" は、クエリ= "ユーザからのu を選択U u.login = WHERE:ログイン")

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

エラーは私が狂っ作ります!

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

おそらく、ユーザーが実際に存在するかどうか(nullではない)を確認する必要があります。 いつかはnullになりますので、再度参照する必要があります

時にはそれは動作しません。

関連する問題