- JAX-WS (Java API for XML Web Services):这是目前最主流、最推荐的方式,它是 Java 标准的一部分,用于创建和调用基于 SOAP (Simple Object Access Protocol) 的 WebService,它的工具支持非常好,可以自动生成客户端代码。
- Apache CXF / Axis2:这两个是流行的第三方框架,它们也支持 JAX-WS 标准,并且功能更强大、更灵活,是 JAX-WS 实现的佼佼者。
- Spring Boot + RestTemplate / WebClient:如果你的 WebService 是基于 RESTful 风格(使用 JSON/XML 等数据格式,通过 HTTP GET/POST 等方法调用),那么你完全不需要 SOAP 相关的工具,你可以直接使用 Spring 框架提供的
RestTemplate(传统)或WebClient(响应式、现代)来调用,就像调用一个普通的 HTTP 接口一样。
下面我将重点讲解最常用的 JAX-WS 方式,并简要提及其他两种方式。

使用 JAX-WS (主流方式)
JAX-WS 调用 WebService 的标准流程是:
- 获取 WSDL 文件地址:WSDL (Web Services Description Language) 是 WebService 的“说明书”,描述了服务的地址、端口、可用的方法、参数和返回值类型等。
- 使用
wsimport工具生成客户端代码:这是最关键的一步,JDK 自带的wsimport工具会根据 WSDL 文件,自动生成一系列 Java 类(包括服务接口、参数类、返回值类等)。 - 在 Java 代码中调用生成的服务:像调用本地 Java 对象一样,调用生成的服务接口。
详细步骤
第 1 步:准备工作
确保你已经安装了 JDK,JAVA_HOME 环境变量配置正确。wsimport 工具在 JDK 的 bin 目录下。
第 2 步:获取 WSDL 文件
假设我们要调用的 WebService 地址是:http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl
这个 URL 的 ?wsdl 参数就是告诉服务器返回 WSDL 描述文件。

第 3 步:使用 wsimport 生成客户端代码
打开你的命令行(CMD 或 PowerShell),切换到你希望存放生成代码的目录(D:\myproject\src\main\java),然后执行以下命令:
wsimport -keep -p com.example.client http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl
命令参数解释:
-keep:生成代码后,保留.java源文件,默认只生成.class文件。-p com.example.client:指定生成的 Java 包名,你可以根据需要修改。- 最后的 URL WSDL 文件的地址。
执行成功后,你会看到在 com.example.client 包下生成了很多 .java 文件,其中最重要的是:
WeatherWebService.java:服务端点接口。WeatherWebServiceService.java:服务,用于获取WeatherWebService接口的实例。- 以及各种用于封装请求参数和返回值的类(如
getWeatherCityName等)。
第 4 步:在 Java 项目中调用生成的代码
你可以将这些生成的 Java 文件(或者直接编译后的 .jar 包)导入到你的 Java 项目中(如 Eclipse, IntelliJ IDEA, 或 Maven 项目),然后开始编写调用代码。

示例代码:
import com.example.client.WeatherWebService; // 生成的服务接口
import com.example.client.WeatherWebServiceService; // 生成的服务类
import com.example.client.ArrayOfString; // 生成的返回值类型
public class WebServiceClient {
public static void main(String[] args) {
try {
// 1. 创建服务实例 (WeatherWebServiceService)
// 通过 getDefaultPort() 方法获取服务端点接口 (WeatherWebService) 的实例
WeatherWebServiceService service = new WeatherWebServiceService();
WeatherWebService weatherWebService = service.getWeatherWebServicePort();
// 2. 调用 WebService 提供的方法
// 假设我们要查询 '北京' 的天气
String cityName = "北京";
ArrayOfString result = weatherWebService.getWeather(cityName, "");
// 3. 处理返回结果
// getString() 方法返回一个包含天气信息的字符串列表
java.util.List<String> weatherInfo = result.getString();
System.out.println("===== " + cityName + " 的天气信息 =====");
for (String info : weatherInfo) {
System.out.println(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第 5 步:处理 WebService 代理(可选,但很重要)
很多 WebService(尤其是企业内部的)运行在需要认证的代理服务器后面,如果你的 Java 程序需要通过代理才能访问外网,你需要在调用前设置系统属性:
// 在调用WebService之前设置
System.setProperty("http.proxyHost", "your.proxy.host");
System.setProperty("http.proxyPort", "8080");
// 如果代理需要认证
System.setProperty("http.proxyUser", "username");
System.setProperty("http.proxyPassword", "password");
使用 Apache CXF 框架
CXF 是一个非常强大的开源框架,它不仅实现了 JAX-WS 标准,还提供了很多高级功能,使用 CXF 可以让你更灵活地配置和调用 WebService。
步骤与 JAX-WS 类似,但生成客户端的工具是 cxf-codegen-plugin (通常在 Maven 项目中使用)。
-
Maven 项目配置: 在你的
pom.xml中添加 CXF 的 Maven 插件。<build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.4.5</version> <!-- 使用合适的版本 --> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build> -
执行生成: 在项目根目录运行
mvn generate-sources命令,CXF 会自动生成客户端代码到target/generated-sources/cxf目录。 -
编写调用代码: 生成的代码和 JAX-WS 的结构类似,调用方式也基本一样。
调用 RESTful WebService (JSON/XML)
如果你的服务是 RESTful 风格,
- URL:
https://api.example.com/users/123 - 方法:
GET - 返回:
{"id": 123, "name": "John Doe"}
那么你不需要 wsimport,直接使用 HTTP 客户端即可。Spring Boot 是目前最流行的选择。
使用 Spring Boot 的 WebClient (推荐)
WebClient 是 Spring 5 引入的响应式、非阻塞的 HTTP 客户端,功能强大且现代。
-
添加依赖 (
pom.xml):<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> -
编写调用代码:
import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; public class RestClientExample { public static void main(String[] args) { // 1. 创建 WebClient 实例 WebClient webClient = WebClient.create("https://api.example.com"); // 2. 定义请求 Mono<User> userMono = webClient.get() .uri("/users/{id}", 123) // 设置URL和路径变量 .retrieve() // 执行请求并获取响应 .bodyToMono(User.class); // 将响应体解析为 User 对象 // 3. 处理响应 (订阅并打印结果) userMono.subscribe(user -> { System.out.println("获取到用户: " + user.getName()); }); // 为了让异步调用能看到结果,主线程需要等待 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } // 假设的 User 类 class User { private int id; private String name; // getters and setters public String getName() { return name; } }
总结与对比
| 特性 | JAX-WS (SOAP) | Spring Boot (RESTful) |
|---|---|---|
| 适用场景 | 企业级、强类型、需要事务和安全性的服务。 | 公开 API、移动端、微服务间的轻量级通信。 |
| 协议 | SOAP (基于 XML) | HTTP (通常使用 JSON 或 XML) |
| 优点 | 标准化、语言无关、功能强大(WS-Security, WS-Addressing等)。 | 简单、轻量、易于理解、与 Spring 生态无缝集成。 |
| 缺点 | 协议复杂、性能相对较低、调试困难。 | 功能相对简单,安全性等需要自己实现或依赖其他标准。 |
| 工具 | wsimport (JDK自带), cxf-codegen-plugin (Maven) |
RestTemplate (同步), WebClient (异步) |
| 调用方式 | 像调用本地 Java 方法一样。 | 像 HTTP 请求一样,明确指定 URL、方法、请求体等。 |
如何选择?
- 如果你要调用的服务是一个传统的、基于 SOAP 的 WebService,并且提供了 WSDL 文件,JAX-WS 是你的不二之选。
- 如果你要调用的服务是现代的 RESTful API,或者你正在使用 Spring Boot 技术栈,那么直接使用 Spring Boot 的
WebClient或RestTemplate会更简单、更高效。
