WebServiceTemplate 是 Spring 官方原生 的 SOAP 客户端工具,无需引入 CXF 等第三方框架,轻量、简单、和 SpringBoot 无缝整合,非常适合调用常规的 WebService(如你截图的 .NET ASMX 服务)。
下面给你 最简洁、可直接运行 的完整步骤,复制粘贴就能用。
一、核心依赖(只需这一个)
在 pom.xml 中添加 Spring 官方 WebService 启动器:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- 可选:XML 解析工具,处理 SOAP 响应 -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
二、配置 WebServiceTemplate
创建配置类,初始化模板并指定 WebService 地址:
java
运行
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.client.core.WebServiceTemplate;
@Configuration
public class WebServiceConfig {
/**
* 配置 WebService 客户端模板
*/
@Bean
public WebServiceTemplate webServiceTemplate() {
WebServiceTemplate template = new WebServiceTemplate();
// 设置你的 WebService 地址(.asmx 地址)
template.setDefaultUri("http://10.38.113.72/WebService1.asmx");
// 编码格式
template.setMessageSender(messageSender());
return template;
}
/**
* HTTP 消息发送器(设置超时、编码)
*/
@Bean
public org.springframework.ws.transport.http.HttpComponentsMessageSender messageSender() {
org.springframework.ws.transport.http.HttpComponentsMessageSender sender = new org.springframework.ws.transport.http.HttpComponentsMessageSender();
sender.setConnectionTimeout(5000);
sender.setReadTimeout(10000);
return sender;
}
}
三、编写调用工具类(两种方式任选)
方式 1:直接发送 SOAP 字符串(最简单,无需生成代码)
适合快速调用,手动拼 XML 报文,最通用。
java
运行
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.client.core.SoapActionCallback;
@Service
public class SoapClientService {
@Autowired
private WebServiceTemplate webServiceTemplate;
/**
* 调用 WebService 方法
* @param param 传入参数
* @return 返回结果
*/
public String callWebService(String param) {
// ===================== 1. 拼接 SOAP 请求 XML =====================
// 从浏览器打开 ?wsdl 查看你的方法名和命名空间
String soapXml = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <HelloWorld xmlns=\"http://tempuri.org/\">\n" +
" <name>" + param + "</name>\n" +
" </HelloWorld>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
// ===================== 2. 设置 SOAPAction(.NET 必须) =====================
// 格式:命名空间 + 方法名
String soapAction = "http://tempuri.org/HelloWorld";
SoapActionCallback callback = new SoapActionCallback(soapAction);
// ===================== 3. 发送请求并获取响应 =====================
Object response = webServiceTemplate.marshalSendAndReceive(soapXml, callback);
// ===================== 4. 把响应转成字符串 =====================
return response.toString();
}
}
方式 2:使用 JAXB 对象自动转换(更优雅)
推荐正式项目使用,自动把 Java 对象转成 SOAP 请求,自动解析响应。
1)根据 WSDL 生成实体类(JDK 自带工具)
打开命令行执行:
bash
运行
wsimport -p com.example.dto -keep http://10.38.113.72/WebService1.asmx?wsdl
会自动生成请求、响应、接口类。
2)配置转换器
java
运行
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 填写生成类所在的包
marshaller.setContextPath("com.example.dto");
return marshaller;
}
@Bean
public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
WebServiceTemplate template = new WebServiceTemplate();
template.setDefaultUri("http://10.38.113.72/WebService1.asmx");
// 绑定序列化工具
template.setMarshaller(marshaller);
template.setUnmarshaller(marshaller);
return template;
}
3)直接用对象调用
java
运行
public String callWithObject(String name) {
// 生成的请求对象
HelloWorld request = new HelloWorld();
request.setName(name);
// 调用
HelloWorldResponse response = (HelloWorldResponse) webServiceTemplate.marshalSendAndReceive(request);
return response.getHelloWorldResult();
}
四、关键注意事项(调用 .NET 必看)
-
必须加
SOAPAction.NET 的 WebService 强制要求请求头带SOAPAction,格式:plaintext
http://tempuri.org/方法名 -
XML 命名空间必须正确 通常是:
xmlns="http://tempuri.org/" -
请求 XML 格式 直接浏览器打开你的服务:
http://10.38.113.72/WebService1.asmx点击方法 → 就能看到官方示例 SOAP 请求体,直接复制使用即可。
五、测试调用
java
运行
@Autowired
private SoapClientService soapClientService;
@Test
void testSoap() {
String result = soapClientService.callWebService("张三");
System.out.println("返回结果:" + result);
}
总结
- 依赖 :只需要
spring-boot-starter-web-services - 核心工具 :
WebServiceTemplate - 调用方式 :
- 简单场景:直接拼 XML 字符串
- 正式项目:wsimport 生成对象 + JAXB 自动转换
- .NET 必备 :
SOAPAction请求头
如果你愿意,我可以根据你实际的 WSDL 地址,直接给你生成可运行的完整调用代码,你只需要复制到项目里就能用!