无法转换为类,因为它们位于加载程序“app”的未命名模块中

Posted

技术标签:

【中文标题】无法转换为类,因为它们位于加载程序“app”的未命名模块中【英文标题】:Cannot be cast to class because they are in unnamed module of loader 'app' 【发布时间】:2019-06-29 10:02:52 【问题描述】:

我正在尝试从 wsdl2java 生成的源创建一个 bean。

每次我尝试运行我的 Spring Boot 应用程序时,都会收到以下错误:

引起:java.lang.ClassCastException:类 org.apache.cxf.endpoint.ClientImpl 不能转换为类 com.xignite.services.XigniteCurrenciesSoap (org.apache.cxf.endpoint.ClientImpl 和 com.xignite.services.XigniteCurrenciesSoap 位于未命名的模块中 加载程序“应用程序”)

我不确定如何将生成的源代码作为一个模块包含在我的主 Spring Boot 应用程序中。

我的目录结构是:

├── build
│   └── generatedsources
│       └── src
│           └── main
│               └── java
│                   └── com
│                       └── xignite
│                           └── services
│      
└── src
    └── main
        ├── java
        │   └── io
        │       └── mateo
        │           └── ***
        │               └── soapconsumption
        └── resources
           └── wsdls

相关系统信息:

openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
Spring Boot 2.1.2.RELEASE Gradle 5.2

我还在这里将项目上传到 Github:https://github.com/ciscoo/soap-consumption-spring-boot

【问题讨论】:

对这里的 wsdl 不太确定...但是,您是否尝试将 module-info.java 添加到您的项目和/或确保您所依赖的模块(对于 org.apache.cxf.endpoint.ClientImpl 类)是在模块路径而不是类路径上解析。 错误信息中没有“因为”。这个附录告诉你的是,这两个类都位于同一个模块中,加载器“app”的未命名模块,这有助于读者理解这个问题与模块完全无关。 ClientImpl 根本不是XigniteCurrenciesSoap 的子类型;这是一个普通的ClassCastException 就我而言,它有点不同。由于不同版本的java之间的冲突,有时会发生Class Cast Exception。在 pom.xml 中我设置为使用“1.8 但在 Intellje IDE 中我设置为使用 java 版本 11。将 java 版本从 11 更改为 8 后问题为我解决了。 【参考方案1】:

我有一个类似的情况,并且(正如@Holger 在评论中提到的)消息中的模块信息只是误导 - 这是试图将某些东西转换为不匹配的东西的实际情况。

在您的情况下,ClientImpl 根本不是XigniteCurrenciesSoap 的子类型。

【讨论】:

我遇到了类似的问题,认为不可能成为 ClassCastException。找到这个答案后,我再次正确检查了异常,结果发现我是从不同包中具有相同名称的超类扩展而来的。因此,即使它看起来像一个不同的问题,它确实是一个 ClassCastException。 在我提出这个问题的时候,我对 Apache CXF 还是很陌生。类转换异常的原因是因为我使用的是 JaxWsClientFactoryBean 而不是 JaxWsProxyFactoryBean。前者返回一个 ClientImpl 而后者返回一个您必须强制转换的代理。我正在研究一些新的工作并记住了这个问题。 就我而言,我正在尝试将 List 转换为 List 并遇到同样的问题【参考方案2】:

堆栈跟踪试图告诉您您已将 XigniteCurrenciesSoap 转换为 ClientImpl

比如下面的例子:

Object returnObj= getXigniteCurrenciesSoap();
return (ClientImpl) returnObj;

你必须找出你在代码中做了什么并修复它。

【讨论】:

以上是关于无法转换为类,因为它们位于加载程序“app”的未命名模块中的主要内容,如果未能解决你的问题,请参考以下文章

重命名 Pyspark Dataframe 中的未命名列

重命名 bigquery 标准 SQL 中的未命名列

[ClassCastException in Inheritance-Why?

如果它们位于两个 Web 应用程序中,Tomcat 是不是会将相同的库文件加载到内存中两次?

由于侧边栏和导航栏,React 中的未找到页面无法正常工作

无法将类型为“System .__ ComObject”的COM对象强制转换为类类型AgentInfo