bil*_*tch 1 stateless-session-bean classcastexception jpql ejb-3.0
这段代码使我感到恼火,有时它起作用,而另一些时候却不起作用!
NamedQuery :(名称=“ User.findByLogin”,查询=“从用户u在哪里选择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;
}
}
Run Code Online (Sandbox Code Playgroud)
错误使我发疯!
Avertissement:EJB5184:在EJB UserFacade上调用期间发生系统异常,方法:public dz.admin.entity.User dz.admin.service.UserFacade.findByLogin(java.lang.String)Avertissement:javax.ejb.EJBException .. .. 由以下原因引起:java.lang.ClassCastException:dz.elit.admin.entity.User无法转换为dz.elit.admin.service.UserFacade.findByLogin(UserFacade.java: 45)
Par*_*tel 15
我在spring-boot应用程序中遇到了同样的问题,浪费了很多时间来解决它。
问题是由于类加载器而产生的。
Model 类和 Session 类的类加载器都是不同的。
System.out.println("ClassLoader : " + Employee.class.getClassLoader());
System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
ClassLoader : org.springframework.boot.devtools.restart.classloader.RestartClassLoader@a3af3c
sun.misc.Launcher$AppClassLoader@1d16e93
Run Code Online (Sandbox Code Playgroud)
由于这种依赖性,我面临这个问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我对此发表评论时,我的代码工作正常,所以我建议您检查一下您的罐子。
System.out.println("ClassLoader : " + Employee.class.getClassLoader());
System.out.println(session.getClass().getClassLoader()); //Hibernate Session object
ClassLoader : sun.misc.Launcher$AppClassLoader@1d16e93
sun.misc.Launcher$AppClassLoader@1d16e93
Run Code Online (Sandbox Code Playgroud)
希望这个回答对你有帮助。
我的猜测是您有不同的类加载器。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!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
至于解决方案,那当然取决于其余的设置...为了让您入门,我可以为您提供一些指向之前提出的相关问题的指导。也许那里的一些答案可能对您有帮助:
一些建议的解决方案包括更改类加载器设置,使用公共接口或序列化/反序列化对象。
| 归档时间: |
|
| 查看次数: |
1780 次 |
| 最近记录: |