在现代系统中,虽然 REST 接口广泛使用,但一些传统平台仍使用 SOAP 协议。本文将手把手教你如何在 Spring Boot 项目中优雅集成并调用 SOAP 接口,支持多个服务配置、注解调用、自定义参数传递等。
🧱 1. 引入 Maven 依赖
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
🛠 2. 使用 wsimport
命令生成客户端代码
打开终端,执行以下命令(替换为实际的 WSDL 地址):
wsimport -keep -p com.example.soapclient https://xxx.cn/tp_core/xxx/MsgWebService?wsdl
⚙️ 3. 编写配置类(支持多服务)
@Configuration
public class SoapClientConfig {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 设置生成的SOAP类所在的包名,这里替换成实际的包路径
marshaller.setContextPath("com.ly.cloud.common.soap");
return marshaller;
}
@Bean
public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri("https://xxx/xxx/service/MsgWebService");
// 配置 marshaller 和 unmarshaller
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
return webServiceTemplate;
}
}
🧩 4. 编写调用 Service(JSON 作为入参)
这里只需要传一个String类型的json入参字符串,即可拿到调用结果。实际场景可以结合Controller实现
@Service
public class MySoapService{
@Autowired
private WebServiceTemplate webServiceTemplate;
public String callSoapService(String message) {
Map<String,Object> map = new HashMap<>();
map.put("OTHER_PK_ID", "");
String jsonString = JSONObject.toJSONString(map);
// 入参json字符串
AddMessage addMessage = new AddMessage();
addMessage.setIn0(jsonString);
System.out.println(jsonString);
AddMessageResponse response = (AddMessageResponse) webServiceTemplate.marshalSendAndReceive(addMessage);
// 调用结果
return response.getOut();
}
}
🧬 5. 多服务扩展配置(可选)
如果你需要调用多个 SOAP 服务接口,可以配置多个 WebServiceTemplate
和 Marshaller
:
@Configuration
public class SoapClientConfig {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 设置生成的SOAP类所在的包名,这里替换成实际的包路径
marshaller.setContextPath("com.ly.cloud.common.soap");
return marshaller;
}
@Bean
public Jaxb2Marshaller marshaller2() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 配置第二个包路径 com.ly.cloud.common.soap.app,对应第二个 namespace
marshaller.setContextPath("com.ly.cloud.common.soap.app");
return marshaller;
}
@Bean
public Jaxb2Marshaller marshaller3() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 配置第三个个包路径 com.ly.cloud.common.soap.email,对应第二个 namespace
marshaller.setContextPath("com.ly.cloud.common.soap.email");
return marshaller;
}
@Bean
public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri("https://xxx/tp_core/service/MsgWebService");
// 配置 marshaller 和 unmarshaller
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
return webServiceTemplate;
}
@Bean
public WebServiceTemplate webServiceTemplate2(Jaxb2Marshaller marshaller2) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri("https://xxx/mp/service/AppService");
// 配置 marshaller 和 unmarshaller
webServiceTemplate.setMarshaller(marshaller2);
webServiceTemplate.setUnmarshaller(marshaller2);
return webServiceTemplate;
}
@Bean
public WebServiceTemplate webServiceTemplate3(Jaxb2Marshaller marshaller3) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri("https://xxx/mp/service/EmailService");
// 配置 marshaller 和 unmarshaller
webServiceTemplate.setMarshaller(marshaller3);
webServiceTemplate.setUnmarshaller(marshaller3);
return webServiceTemplate;
}
}
使用的过程中,分别注入对应的即可。
✅ 总结
本文完整展示了 Spring Boot 如何调用 SOAP 接口的全过程,涵盖:
-
wsimport
生成代码 -
Spring 配置与依赖注入
-
JSON 参数封装与发送
-
多服务并存配置
SOAP 虽老,实战依旧有用,希望本文对你有所帮助。如果你觉得不错,欢迎点赞收藏支持一下👍