2017-05-09 72 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(); 

可能您需要检查用户是否真的存在(非空)。 有时它将是空的,你将需要重新参考它

有时它工作,而有些时候它不会!

相关问题