【问题标题】:ClassCastException Error from List to Single Object从列表到单个对象的 ClassCastException 错误
【发布时间】:2015-08-04 09:26:37
【问题描述】:

我无法从列表中获取单个位置对象。 在 primefaces dataTable 中调用 getLocations() 有效。我可以显示所有位置。 但是当我想从位置列表中获取单个位置时,我总是会得到一个 ClassCastException。 我使用 JPA(休眠)。

实体 Bean:

@Entity
@Table(name = "location")
@NamedQueries({
    @NamedQuery(name = "Location.findAll", query = "SELECT l FROM Location l")})
public class Location implements Serializable {
    private static final long serialVersionUID = 1L;

@Column(name = "name")
private String name;
...

CDI 豆:

private List<Location> locations = null;

@PostConstruct
public void init() {
    locations = getService().findAll();
    Iterator iter = getLocations().iterator();
    Location first = (Location)iter.next(); //ClassCastException

同样的问题:

for (Location location : getLocations()) //Classcastexception
 {...}

错误信息:

java.lang.ClassCastException: package.ejb.entity.Location cannot be cast to package.ejb.entity.Location

更新: 整个应用程序是一个 EAR 项目。 位置实体 Bean 包含在 EJB-Jar 中。 还有LocationService Session Bean,它被注入到CDI Bean中。 (对于 findAll() 调用)

CDI Bean 包含在 WAR 中。

@shruti1810 提到,可能存在类加载问题。 我从 Oracle 阅读了文档 The Class Loader Hierarchy 我所理解的是,EJB 类加载器是 WAR 类加载器的父级。因此,我不明白为什么会有 ClassCastException。 CDI Bean 中的位置是否从另一个类加载器加载,而不是 findAll() 方法给出的位置?

【问题讨论】:

    标签: hibernate jakarta-ee ejb


    【解决方案1】:

    这似乎是一个类加载器问题 - 当同一个类被两个不同的类加载器加载时,同一类上的ClassCastException 是可能的,即你已经用一个类加载器加载了这个类,然后尝试将它转换为相同的由另一个类加载器加载的类。

    在这里,您可以做以下两件事之一:

    有一个通用的类加载器,它可以加载您的自定义类加载器要使用的类。因此,在您的情况下,您将有一个新的类加载器来加载给定的类,而您的自定义类加载器将扩展这个类加载器。

    另一种解决方案是在两个类加载器之间传递“序列化”状态。将一个实例序列化为字节数组,并通过反序列化对象流在另一个类加载器中重构对象。

    【讨论】:

    • 感谢您的回复。这是因为我有一个 EAR 项目并且实体 Bean 在 EJB Jar 存档中,而 CDI Bean 在 WAR 存档中?什么是解决方法?
    • 在这里,您可以做以下两件事之一: 拥有一个通用的类加载器,它加载您的自定义类加载器要使用的类。因此,在您的情况下,您将有一个新的类加载器来加载给定的类,而您的自定义类加载器将扩展这个类加载器。另一种解决方案是在两个类加载器之间传递“序列化”状态。将一个实例序列化为字节数组,并通过反序列化对象流在另一个类加载器中重建对象。
    • 感谢您的快速回复,我会试一试并确认它是否有效。
    • 我阅读了一些关于类加载的文档,但我仍然不知道,为什么类加载不起作用。我更新了我的开始帖子。
    • 通过降级我的休眠版本来修复它。
    【解决方案2】:

    通过将我的休眠版本从 4.3.9-Final 降级到 4.3.5-Final 来修复它。我还不知道是什么导致了这个问题。但似乎hibernate 4.3.5+存在几个问题。

    另一个主题,具有类似的修复: here

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 2014-08-28
      • 2021-01-13
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多