You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:16:01