JDK9 及以上版本适配 wsimport 生成的 SOAP 代码
背景
在系统集成场景中,部分遗留系统及第三方服务仍保留 SOAP 接口。尽管 SOAP 协议已逐步被 REST 等轻量级方案替代,但出于兼容性考虑,新系统有时仍需通过 SOAP 协议进行跨系统通信。本文介绍基于 JDK8+ 环境(重点验证 JDK17)的 SOAP 客户端实现方案,解决兼容性问题。
一、wsimport自动生成客户端代码
工具简介
wsimport是 JDK8 内置的命令行工具,核心功能为:解析 SOAP 服务的 WSDL 文档,自动生成可直接调用的 Java 客户端代码。生成内容包括:
- 请求/响应参数的实体类(XML 与 Java 对象映射)
- 服务接口(Service 类)及实现类
- 内置 HTTP 通信、XML 序列化/反序列化逻辑
使用命令
wsimport -encoding UTF-8 -s 存放 Java 代码的本地目录 -p 生成代码的包名 -keep 远程 WSDL 地址
示例:
wsimport -encoding UTF-8 -s D:\project\springboot-soap-client\src\main\java -p com.example.soap.client.weather -keep http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
二、JDK9+(JDK17)适配 wsimport 生成的代码
核心问题
wsimport 生成的类里会包含 javax.xml.bind.annotation.、javax.jws.、javax.xml.ws.*等引用,然而,2019 年 Oracle 将 JavaEE 捐赠给 Eclipse 基金会,Eclipse 将其重命名为 Jakarta EE,并且将所有 API 的包名做了「一刀切」迁移:所有 javax.xxx 全部改为 jakarta.xxx,这就很恶心了。因为一旦引用错误,比如用 3.0.x 的 jakarta 版本会出现包名冲突,反而出问题,使得编译失败!
依赖管理策略
需严格匹配 Jakarta EE 版本与 JDK 兼容性,推荐使用经过验证的依赖组合(以 Maven 为例):
<!-- Spring WebServices 核心:必须加!提供 WebServiceTemplate 和 JAXB2Marshaller -->
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.3.1.RELEASE</version>
<exclusions>
<exclusion>
<>commons-logging
commons-logging
javax.jws
javax.jws-api
1.1
javax.xml.ws
jaxws-api
2.3.1
com.sun.xml.ws
jaxws-rt
2.1.3
javax.xml.ws
jaxws-api
javax.activation
activation
javax.xml.soap
saaj-api
javax.xml.stream
stax-api

