记录一次使用CXF调用webService全过程
1.下载并且设置CXF环境变量
2.使用wsdl2java方式生成对应的java代码
可执行命令
wsdl2java -encoding utf-8 -d F:\smx\projects\mzsh\backend_dev\main\src\com\smx\ezfix\sei C:\Users\PascalLee\Desktop\service.xml
其中,后面还可以加很多参数,
```java
-o <path> : 指定生成代码的输出路径
-a : 生成异步模式的代码
-s : 生成同步模式的代码
-p <pkg> : 指定代码的package名称
-l <languange> : 使用的语言(Java/C) 默认是java
-t : 为代码生成测试用例
-ss : 生成服务端代码 默认不生成
-sd : 生成服务描述文件 services.xml,仅与-ss一同使用
-d <databinding> : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g : 生成服务端和客户端的代码
-pn <port_name> : 当WSDL中有多个port时,指定其中一个port
-sn <serv_name> : 选择WSDL中的一个service
-u : 展开data-binding的类
-r <path> : 为代码生成指定一个repository
-ssi : 为服务端实现代码生成接口类
-S : 为生成的源码指定存储路径
-R : 为生成的resources指定存储路径
--noBuildXML : 输出中不生成build.xml文件
--noWSDL : 在resources目录中不生成WSDL文件
--noMessageReceiver : 不生成MessageReceiver类
- **-d**后面的第一个参数是我们想将java代码生成的位置
- 第二个参数是webservice的地址,我将它存储在一个xml文件里,或者直接写这个地址都是可以的
然后生成相应代码.可在对应位置进行查看.
## 3.客户端调用
```java
try {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 设置请求接口
factory.setServiceClass(RtlMessSoap.class);
factory.setAddress("http://aaaa.bbbb.com:001/XXXX.asmx?wsdl");
// 创建客户端对象
RtlMessSoap webService = (RtlMessSoap) factory.create();
// 设置客户端的配置信息,超时等.
Client proxy = ClientProxy.getClient(webService);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
// 连接超时时间
policy.setConnectionTimeout(Long.valueOf(5000));
// 请求超时时间.(读取超时)
policy.setReceiveTimeout(Long.valueOf(5000));
conduit.setClient(policy);
String loginSEI = webService.loginSEI(account, password);
logger.info("loginSEI:" + loginSEI);
// 如果sei为空,验证酷家乐账号白名单
if ("E".equals(loginSEI)) {
String resultSEIByKJL = webService.loginSEIByKJL(account, password);
logger.info("resultSEIByKJL:" + resultSEIByKJL);
if (StringUtils.isEmpty(resultSEIByKJL)) {
return -1;
}
}
} catch (Exception e) {
logger.info(e.getMessage());
}
上述方法可以设置调用时候的超时时间和接收数据的超时时间,亲测可用,里面的RtlMessSoap这个类为对应生成的代码里的一个有很多方法的接口.各个不同的地址生成的这个类不一样,要根据自己的代码对应修改.
所需jar包:
由于我项目是对应的spring4.3,所以对应的包都是3.2.12版本的,如下
简单的下载方式见另外一篇文章.
命令行下载mvn相关jar包
一开始自己遇到这个问题也是一头雾水,这种方式的缺点就是不是动态的调用webService,每次webSwervice发布之后,都需要重新生成一次java代码.所以建议采用别的方式,比如Axis或者Axis2,再或者HttpClient的方式都可以实现WebService的调用.
还有一些别的方法也能实现wsdl2java设置超时时间的问题,
参考文章:
XML方式
xml方式自己测试的时候并未奏效,需要很多依赖,下载上述图片中的jar包可以正常运转,但是没生效
代码方式
这种也是,自己测试的时候可能是有的地方没搞明白,没生效,可以访问,但是设置的超时时间没生效.