SpringBoot集成WebService
永不秃头的木白 2024-07-27 17:33:02 阅读 69
前言
首先,WebService是一个面向服务的历史技术产品,现在基本都使用restful的http接口;会使用到WebService的一般都是国企产品(这意味着没得选,并且很难找到开发人员对接,出入参只能自己摸索),例如中国移动的内网隔离的短信平台。
对接WebService之前,有一些基础建议先放在前面:
1.对XML语言有一定的基础,在获取一个wsdl服务端地址时,先用浏览器访问地址,阅读对应的xml内容,对自己关心的operation(解析到java中就是对应的函数方法)进行仔细地阅读,观察这个operation的入参情况(着重确定参数type类型)
2.下载soapui工具,进行wsdl服务端的在线调试(类似postman),很方便,先确定链路是通的,再进行代码的编写。
实战遇到的问题
1.此处不应有9
为了快速出活,我这边的实践是使用apache-cxf生成webservice的java代理代码。出现这个错误是因为JAVA_HOME环境变量的配置问题,我这边的实际情况是电脑安装了JDK17,先卸载这个JDK17之后,电脑只保留JDK8之后问题得到解决。
2.No scheme found in URI
在网络协议中,出现这个问题就是没指定http或者https,但是本次实战指定的uri是固定的,所以不会有问题,在soapui中也出现这个问题,所以确定是入参问题。观察对应的xml解析发现某个参数是anyUri类型,这个类型生成的代理代码是List<String> ,也就是说这个String必须是uri格式的,实际存储的是手机号码,在xml协议中的手机号码uri格式是需要携带 【tel:】标识的,所以完整参数是: tel:135****6666 这样。
实战
生成客户端代码
生成Java客户端代理代码,自己百度apache-cxf官网,我下载的是apache-cxf 3.5.8版本的Windows包,配置好环境变量之后,使用下面的命令在cmd中生成客户端代码
wsdl2java -encoding utf-8 -d E:\ws http://xxxx?wsdl
依赖
外面的教程一般是引入apache-cxf依赖或者spring自己的ws依赖,我只需要使用到WebServiceTemplate,所以只引入核心包,依赖是
<code><dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
Config配置信息
将客户端代码复制到自己的工程中,一般这个代码有自己的包路径,所以放在main下面,跟自己的工程目录平级;生成的代码会很多,其中跟自己需求关系很少,有时间的可以自己将不相关的JavaBean等文件删掉。下面是基本的配置代码
@Configuration
public class WebServiceConfig {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 设置需要转换的 Java 类所在的包,避免程序启动报错
marshaller.setPackagesToScan("org.csapi");
return marshaller;
}
@Bean
public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
WebServiceTemplate template = new WebServiceTemplate();
template.setMarshaller(marshaller);
template.setUnmarshaller(marshaller);
//设置默认的请求url
template.setDefaultUri("http://***/**");
return template;
}
}
客户端调用伪代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.core.WebServiceTemplate;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
@Component
public class WebServiceClient {
@Resource
private WebServiceTemplate webServiceTemplate;
public void sendSms(String content, List<String> phones) {
phones.forEach(phoneNo -> {
SendRequest request = new SendRequest();
request.setMessage(content);
request.setDestinationAddresses(Collections.singletonList(String.format("tel:%s", phoneNo)));
ThreadPool.execute(() -> {
try {
//WebServiceTemplate内部封装了对operation的自动判定,根据入参请求中的注解,自己判定需要用哪个operation并转换response, 所以尽量将生成的所有代理类代码复制出来
Object object = webServiceTemplate.marshalSendAndReceive(request);
} catch (Exception exception) {
}
});
});
}
}
总结
没有什么特别的总结,over
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。