1.基于wsdl文件生成相关代码
生成代码需要借助插件,这里选用的是maven插件(gradle也有对应的,没整的起来)maven-jaxb2-plugin
创建一个maven项目,引入插件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.longnows</groupId>
<artifactId>wsdl-to-java-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.15.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generatePackage>cn.longnows.wsdl2java.generate</generatePackage>
<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
<schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
<schemaIncludes>
<include>*.wsdl</include>
</schemaIncludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
wsdl文件放到指定目录下
生成代码
这时候你的maven插件中应该就有刚刚引入的插件了,没有的刷新一下maven
运行结束后,可以看到所需的入参出参等文件都已经自动生成了,搬到自己项目中即可
注:webservice接口中的命名跟java命名规范可能不太一样,需要修改的自行修改即可。
2.编写客户端代码
引入依赖
implementation 'org.springframework.boot:spring-boot-starter-web-services:2.6.3'
implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2'
implementation 'javax.annotation:javax.annotation-api:1.3.2'
增加配置类
@Configuration
public class MarshallerConfig {
/**
* 转换器
* @return
*/
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("cn.longnows.刚刚生成的代码你所放的目录");
return marshaller;
}
}
client代码
@Component
public class KiaWsClient extends WebServiceGatewaySupport {
/**
* marshaller
*/
@Autowired
private Jaxb2Marshaller marshaller;
/**
* 默认uri,wsdl文件中会有一个<soap:address>标签,里面的location属性就是这个
*/
@Value("${kia.ws.default-uri")
private String defaultUrl;
/**
* 发送请求
* @param request 生成的入参对象
* @return
*/
public KiaBackFillResponse sendRequest(KiaBackFillReq request) {
setMarshaller(marshaller);
setUnmarshaller(marshaller);
// 父类方法,获取WebServiceTemplate
WebServiceTemplate webServiceTemplate = getWebServiceTemplate();
// 创建消息发送器
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
// 设置连接超时时间为2秒
messageSender.setConnectionTimeout(2000);
// 设置读取超时时间为2秒
messageSender.setReadTimeout(2000);
webServiceTemplate.setMessageSender(messageSender);
// 发送消息,泛型是你生成的出参对象
JAXBElement<KiaBackFillResponse> responseElement =
(JAXBElement<KiaBackFillResponse>) webServiceTemplate.marshalSendAndReceive(defaultUrl, request);
return responseElement.getValue();
}
}
调用方法
@Service
public class KiaEntryBackFillService {
/**
* 日志
*/
private static final Logger logger = LoggerFactory.getLogger(KiaEntryBackFillService.class);
/**
* ws客户端
*/
@Autowired
private KiaWsClient wsClient;
/**
* 发送请求
* @param inList
*/
public void send(InputDataEntity inList) {
// 创建请求对象
KiaBackFillReq request = new KiaBackFillReq();
InputData inData = new InputData();
inData.getInputDataList().add(inList);
request.setInputData(inData);
// 发送请求并获取响应
try {
wsClient.sendRequest(request);
} catch (Exception e) {
if (logger.isErrorEnabled()) {
logger.error("xxx", e);
}
}
}
}
然后在你需要的地方调用这个service的send方法即可。
SoapUI使用
对接初期没有写好代码,但是又需要确认双方的出参入参准确性的时候,可以使用SoapUI工具进行接口调用。
创建一个soap项目,它会根据wsdl文件替你生成入参
填好参数,点击左上角箭头即可发送请求