webservicetemplate 是 spring 官方原生的 soap 客户端工具,无需引入 cxf 等第三方框架,轻量、简单、和 springboot 无缝整合,非常适合调用常规的 webservice(如你截图的 .net asmx 服务)。
下面给你 最简洁、可直接运行 的完整步骤,复制粘贴就能用。
一、核心依赖(只需这一个)
在 pom.xml 中添加 spring 官方 webservice 启动器:
<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 地址:
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 报文,最通用。
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 自带工具)
打开命令行执行:
wsimport -p com.example.dto -keep http://10.38.113.72/webservice1.asmx?wsdl
会自动生成请求、响应、接口类。
2)配置转换器
@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)直接用对象调用
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,格式:
http://tempuri.org/方法名
- xml 命名空间必须正确通常是:
xmlns="http://tempuri.org/" - 请求 xml 格式直接浏览器打开你的服务:
http://10.38.113.72/webservice1.asmx点击方法 → 就能看到官方示例 soap 请求体,直接复制使用即可。
五、测试调用
@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 地址,直接给你生成可运行的完整调用代码,你只需要复制到项目里就能用!
到此这篇关于spring boot 使用 webservicetemplate 调用 webservice的完整步骤的文章就介绍到这了,更多相关spring boot调用 webservice内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论