记录一次使用CXF调用webService全过程

记录一次使用CXF调用webService全过程

1.下载并且设置CXF环境变量

下载的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版本的,如下
所需jar包
简单的下载方式见另外一篇文章.
命令行下载mvn相关jar包
一开始自己遇到这个问题也是一头雾水,这种方式的缺点就是不是动态的调用webService,每次webSwervice发布之后,都需要重新生成一次java代码.所以建议采用别的方式,比如Axis或者Axis2,再或者HttpClient的方式都可以实现WebService的调用.
还有一些别的方法也能实现wsdl2java设置超时时间的问题,
参考文章:
XML方式
xml方式自己测试的时候并未奏效,需要很多依赖,下载上述图片中的jar包可以正常运转,但是没生效
代码方式
这种也是,自己测试的时候可能是有的地方没搞明白,没生效,可以访问,但是设置的超时时间没生效.

共勉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值