gpt4 book ai didi

java - 头脑 Storm : Weird JPA problem, 可能是类路径或 jar 版本问题?

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:47 25 4
gpt4 key购买 nike

我看到一条奇怪的错误消息,正在寻找一些关于可能是什么问题的想法。我对使用 JPA 有点陌生。

我有一个应用程序,我在其中使用 Spring 的实体管理器工厂 (LocalContainerEntityManagerFactoryBean),EclipseLink 作为我的 ORM 提供程序,连接到 MySQL 数据库并使用 Maven 构建。我不确定这是否重要......

当我将此应用程序部署到 Glassfish 时,该应用程序按预期运行。

问题是,我创建了一组独立的单元测试以在 Glassfish 之外运行,但这些测试无法正常工作。我收到以下错误(我稍微编辑了类名)

com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity

对象不能转换为同类型的类?怎么可能?

这是错误的代码片段

Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();
for (Object entityObject: entityObjects) {
com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

以前,我的这段代码产生了同样的错误:

CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class));
List entityObjects = entityManager.createQuery(cq).getResultList();
for (Object entityObject: entityObjects) {
com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject;

此代码问题与我部署到服务器的问题相同。

如果有帮助,这里是最里面的异常

Caused by: java.lang.ClassCastException: com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity
at com.xyz.abc.services.persistence.entity.factory.MyEntityFactory.createBeans(MyEntityFactory.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115)
... 37 more

我猜测我在 Glassfish 中使用的一些 jar 与我在测试中使用的不同。我查看了列为“已提供”的所有 jar ,并且很确定它们都是来自 Glassfish 的相同 jar 。

如果您以前遇到过这个奇怪的问题,或者有任何纠正它的想法,请告诉我。

最佳答案

这也可能是类加载问题。由两个不同的类加载器加载的相同类定义被 JVM 视为不同的类。

你可以试试这个来获取游戏中类加载器的信息:

Query q = entityManager.createNamedQuery("MyEntity.findAll");
List entityObjects = q.getResultList();

ClassLoader loader1 =
com.xyz.abc.services.persistence.entity.MyEntity.getClass().getClassLoader();
System.out.println("MyEntity's class loader is " + loader1);
for (Object entityObject: entityObjects) {
ClassLoader loader2 = entityObject.getClass().getClassLoader();
System.out.println("Class loader of entity " + entityObject + " is " + loader2);
}

您当然可以使用对首选日志记录框架的调用,而不是 System.out.println

这里是 a series of articles有关类加载的更多详细信息。

关于java - 头脑 Storm : Weird JPA problem, 可能是类路径或 jar 版本问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com