Java17升级后SOAP服务调用报错:icf为空致InvocationController获取失败
问题分析与解决方案
这个异常的核心原因是Apache Axis2的JAX-WS实现在Java 17的模块系统(JPMS)下无法正确加载InvocationControllerFactory类,通常和版本兼容性、SPI服务加载机制或类加载配置有关,以下是针对性的解决步骤:
1. 升级Axis2到Java 17兼容版本
旧版Axis2(1.7.x及更早)对Java 17的模块系统支持不完善,直接升级到**Axis2 1.8.2+**是最直接的修复方案:
// Gradle依赖配置 implementation 'org.apache.axis2:axis2-jaxws:1.8.2' implementation 'org.apache.axis2:axis2-kernel:1.8.2' implementation 'org.apache.axis2:axis2-transport-http:1.8.2'
2. 修复SPI服务加载问题
Axis2通过SPI(服务提供者接口)加载InvocationControllerFactory,Java 17下需确保SPI文件可被正确访问:
- 如果项目使用
module-info.java,添加模块声明:requires org.apache.axis2.jaxws; requires org.apache.axis2.kernel; // 开放Stub类所在包给Axis2访问 opens com.your.project.stub to org.apache.axis2.jaxws; - 未使用模块系统时,检查Spring Boot打包配置,确保
META-INF/services目录下的SPI文件未被排除(Gradle Spring Boot插件默认会包含,自定义打包时需注意)。
3. 替换废弃的wsimport生成方式
Java 17已完全移除wsimport工具,原工具生成的Stub类可能存在JPMS兼容性问题,改用Gradle JAX-WS插件生成适配Java 17的Stub:
plugins { id 'com.github.jaxws-gradle-plugin' version '2.0.1' } jaxws { wsdl = file('src/main/resources/your-service.wsdl') packageName = 'com.your.project.stub' sourceCompatibility = 17 targetCompatibility = 17 }
4. 调整Spring Boot类加载策略
Spring Boot的LaunchedURLClassLoader在Java 17下可能存在类加载层级问题,可强制使用直接类加载器:
- 在
application.properties中添加:spring.boot.class-loader=direct - 或启动时添加参数:
--spring.boot.class-loader=direct
5. 排查依赖冲突
检查是否存在多版本Axis2依赖共存的情况,通过Gradle命令查看依赖树并排除旧版:
configurations.all { exclude group: 'org.apache.axis2', module: 'axis2-jaxws', version: '1.7.x' }
内容的提问来源于stack exchange,提问作者user3678654
相关产品推荐
相关产品推荐

