根据wsdl接口通过Apache CXF生成客户端代码
1、下载Apache CXF包,配置环境变量
下载链接:http://cxf.apache.org/download.html
在path环境变量中,加入bin目录,G:\tool\apache-cxf-3.3.5\bin,
验证环境变量是否配置成功,在dos窗口,输入wsdl2java 即可。
2、生成客户端代码
1、常用到的命令:
wsdl2java -h 可以得到详细的参考文档
-p 指定cxf生成代码的包名;例如 希望在项目中的com.java.service.send包中生成代码,则在命令中加入 -p com.java.service.send ,代码就会生成在项目的send包中。该命令可以避免生成的代码中包名与项目包冲突的情况。
-d 指定cxf生成代码的目录;生成的代码,会在指定的目录 + -p 指定的包名 中。
-client 是否生成客户端测试webservice的代码;会生成main方法测试代码,可以参照这个类写调用代码。
-encoding 指定编码格式,如 UTF-8;
以下为了解命令:
-server 生成服务器启动webservice 的代码;
-impl 生成webservice的实现代码;
-keep 保留源文件;
-s <dir> 指定源代码存放目录;
-autoNameResolution 当报异常:具有相同名称 "xxxx" 的类/接口已在使用。请使用类定制设置来解决此冲突。
是因为 wsdl 文档中有重复的元素导致的,在命令中加此参数,可以解决类名冲突的问题。
-ant 生成build.xml文件;
-verbose 指定生成器以详细模式运行;
-all 生成所有开始端点代码;
-version 显示版本;
2、wsdl文件准备:
① 服务端 url,例如 http://168.1.x.x:8090/service-epr/services/epr?wsdl
② wsdl文件,例如 xxxx.wsdl 不常用。可以访问wsdl接口,下载页面内容,去除无用的接口定义,否则会生成不需要的对象。
3、新建java工程,引入所需依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.9</version>
</dependency>
在applicationContext.xml 添加命名路径和标签(这里新创建了一个配置文件applicationContext-cxf.xml,方便配置):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
</beans>
4、生成客户端代码:
在dos窗口,输入 wsdl2java -p com.abc.service.send -d G:\workspace\ws_client\src\main\java -client http://168.1.x.x:8090/service-epr/services/epr?wsdl
回车,完成。使用 wsdl 文件生成代码,与使用 url 生成方法一致。
也可以cd进到G:\workspace\ws_client\src\main\java目录下,wsdl2java -p com.abc.service.send -client http://168.1.x.x:8090/service-epr/services/epr?wsdl
5、生成客户端代码后,可以按生成的客户端测试代码调用服务端接口,或者自己写:
TestServiceIService ss= new TestServiceIService();
TestServiceI service = ss.getTestServiceIPort();
//添加调用接口所需参数
Person p = new Person();
p.setName("张三");
Response res = service.getInfo(p);
System.out.println("返回的结果是" + res.getCode() +" " + res.getMsg());
6、补充:
服务端需要添加头信息(验证信息)时,可在服务端接口的参数上指定添加@WebParam(name = "token", header = true),如:
Response getInfo(@WebParam(name = "person") Person person,@WebParam(name = "token", header = true) String token,@WebParam(name = "idCode", header = true) String idCode,@WebParam(name = "requesttype", header = true) String requestType);
//此接口生成的wsdl
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:edis="http://eprService.factory.com/">
<soapenv:Header>
<edis:requesttype>?</edis:requesttype>
<edis:idCode>?</edis:idCode>
<edis:token>?</edis:token>
</soapenv:Header>
<soapenv:Body>
<edis:getInfo>
<!--Optional:-->
<person>
<!--Optional:-->
<name>?</name>
</person>
</edis:getInfo>
</soapenv:Body>
</soapenv:Envelope>
客户端使用 wsdl2java 生成代码后,调用服务端接口方法时,直接set参数就可以完成头信息的添加。
* 使用soapUI也可以生成客户端代码,以后学习后补充。
参考资源:https://blog.csdn.net/panshoujia/article/details/78899160