java - 完全奇怪的 ClassCastException

标签 java wildfly classcastexception

<分区>

我正在使用 NetBeans 和 Maven 构建一个 JEE 项目。该项目包含一个 EJB 模块、一个 Web 模块和一个 SE 类库。像往常一样,Web 模块将 EJB 模块作为依赖项。它们都将类库作为依赖项。该项目是使用 GlassFish 或 JBoss 以及最近的 WildFly 工作多年的项目的修改副本。原始项目是使用 Ant 构建和部署的。现在我正在使用 Maven。新的 (maven) 项目使用 GlassFish 运行良好,但不使用 WildFly 10。它在绝对不应失败的强制转换语句中抛出 ClassCastException。为了尝试确定问题的根源,我进行了一个简单的测试。它的结果是完全奇怪的。在这里:

首先我创建了 3 个接口(interface),一个在类库中,一个在每个模块中。它们是:

// interface at the class library
package jee2ap102.lib;
public interface I01 {
}

// interface at the EJB module
package jee2ap102.ejb;
public interface I0101 extends jee2ap102.lib.I01 {
}

// interface at the Web module
package jee2ap102.web;
public interface I010101 extends jee2ap102.ejb.I0101 {
}

然后在 Web 模块中我创建了一个 bean 并添加了以下方法:

public String check() {
    boolean b;
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.ejb.I0101.class);
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.web.I010101.class);
    b = jee2ap102.ejb.I0101.class.isAssignableFrom(jee2ap102.web.I010101.class);
}

这三个语句应该返回 true,但只有最后一个语句返回 true。 据此,位于类库中的接口(interface) I01 是层次结构的根,不能从位于库外部的任何接口(interface)(EJB 或 Web 模块)分配,不管这些接口(interface)是什么接口(interface)扩展它。一致地,尝试将 I0101 或 I010101 转换为 I01 将抛出 ClassCastException。

如果能帮助我理解和解决这个问题,我将不胜感激。

最佳答案

根据我的评论,问题很可能是由于 war arhive 使用与 lib jar 不同的类加载器这一事实引起的。这是描述in this question

关于java - 完全奇怪的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903949/

相关文章:

ssl - 如何在 WildFly 中启用某些密码套件?

java - 将 ArrayList<String[]> 转换为 String[][] 或 Object[][]

scala - 为什么用 Option 包装泛型方法调用会延迟 ClassCastException?

java - 为什么会出现Permgen OutOfMemoryError?

java - 如何在单个 for 循环中动态更改多个 jLabel 的文本?

java - 将泛型集合转换为数组

java - 安卓 PACT 演示应用程序

jakarta-ee - jboss-cli.sh 在 centos 7 上不起作用

jboss - 此处不允许使用 Wildfly 子系统配置属性

Java 使用 BeanBinding Netbeans 更新 JList