Springboot与Soap协议交互(一)Client篇
前言
最近,由于项目需要,研究了一下Springboot和SOAP协议之间进行交互的方式,基本可以分为种情况,一种是作为客户端去调SOAP接口,另一种是作为服务端提供SOAP接口,在全网搜索很久后,发现了很多教程是存在问题,要么是没给出具体依赖导致报错,要么就是某些文件名写错,或者写的不清楚,所以今天在这里记录一下,帮助有需要的人,本系列文章分为客户端和服务器两篇文章,分别是作为客户端请求SOAP接口和作为服务端提供SOAP接口。
测试的Soap接口
我们本次用来做测试的SOAP接口是http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl
这个接口是IP地址搜索服务,包含中国和国外已知的IP地址数据,是目前最完整的IP地址数据,记录数量现已超过37万条。如下是通过SoapUI接口测试工具测试示例图:
使用jdk自带工具wsimport生成相关java类
wsimport -s /Users/aie/Documents/soap -p com.example.demo5.wsdl -encoding utf-8 http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl
-s 生成java类存储路径;
-p java类在springboot项目里面所在包名;
-encoding 文件编码,建议使用utf-8;
wsimport生成java类示意图
java类导入在Springboot项目里面的位置
pom.xml相关依赖配置
在研究Springboot和Soap协议交互调通的过程中,我发现正确配置依赖的重要性,而且如果发现依赖一直导入失败就需要考虑为本地的Maven仓库配置阿里云镜像,速度会有质的提升,下面就将本项目的pom.xml配置完整的贴出来,供需要的同学参考。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.demo5</groupId>
<artifactId>demo.demo5</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo.demo5</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- WSServletContextListener -->
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.sun.xml.fastinfoset</groupId>
<artifactId>FastInfoset</artifactId>
<version>1.2.9</version>
</dependency>
<!-- WSServletContextListener -->
<!-- https://mvnrepository.com/artifact/javax.jws/javax.jws-api -->
<dependency>
<groupId>javax.jws</groupId>
<artifactId>javax.jws-api</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建配置类
package com.example.demo5;
import com.example.demo5.wsdl.IpAddressSearchWebService;
import com.example.demo5.wsdl.IpAddressSearchWebServiceSoap;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IpConfig {
@Bean
public IpAddressSearchWebServiceSoap webService(){
return new IpAddressSearchWebService().getIpAddressSearchWebServiceSoap();
}
}
创建测试方法
package com.example.demo5;
import com.example.demo5.wsdl.ArrayOfString;
import com.example.demo5.wsdl.IpAddressSearchWebServiceSoap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@RequestMapping("/soap")
public class Application {
@Autowired
private IpAddressSearchWebServiceSoap soap;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/{ip}")
public ArrayOfString searchIp(@PathVariable("ip") String ip) {
ArrayOfString response = soap.getCountryCityByIp(ip);
return response;
}
}
启动项目,在浏览器调Springboot接口去获取Soap服务并打印返回值
总结
自此,在Springboot项目中与Soap协议进行交互,作为客户端请求Soap接口并返回的demo就到此结束了,相关教程在网上很多,但是真正可以用的比较少,不太适合不熟悉Soap协议又有紧急需求的同学,所以在此记录,希望能够帮助有需要的同学。