通过cxf的wsdl2java的API生成webservice客户端代码
程序员文章站
2022-06-16 12:51:02
...
项目框架中要增加webservice的功能,引入了cxf2.7.6作为框架支持,为了加快客户端的编写,采用生成的方式通过wsdl生成客户端代码。
客户端代码自自动生成有三种方式:
The WSDL2Java tool will generate JAX-WS clients from your WSDL. You can run WSDL2java one of three ways: The command line The Maven Plugin With the WSDL2Java API
第一种通过wsdl2java命令行的形式测试通过,但通过java调用外部命令总是有环境变量的问题还要配置相应工具路径等操作,比较麻烦。
第二种通过Maven Plugin生成,对Maven不熟悉,跳过
第三种通过WSDL2Java API生成,在网上百度谷歌的搜索了半天,没有这样的文章,也没有这么做的,可能是方法太过偏激了。但为了框架中可以保证开发人员对webservice的使用可以快速上手,便花了很长时间研究这个事儿,后来在wsdl2java.bat中找到解决办法。
解决办法如下:
1. 工具类:
import java.net.URLDecoder; import java.util.Locale; import java.util.ResourceBundle; import org.apache.cxf.tools.common.ToolContext; import org.apache.cxf.tools.wsdlto.WSDLToJava; /** * @desc 客户端代码生成工具类 * @version v1.0, 2013-12-11 */ public class ClientCodeGenerator { public static void main(String[] args) throws Exception { ClientCodeGenerator.generateClient(); } public static void generateClient() { try { System.out.println("---------------client code generate starting.--------------"); String properties = "com.apps.mymis.demo.webservice.client.wsdl2java.ws-client-config"; ResourceBundle rb = ResourceBundle.getBundle(properties, Locale.getDefault()); String serviceWsdlUrl = rb.getString("ws.client.serviceWSDLUrl"); String stubcodeTargetPath = rb.getString("ws.client.stubCodeTargetPath"); String async = rb.getString("ws.client.async"); System.out.println("---------------service WSDL URL is " + serviceWsdlUrl + ".--------------"); System.out.println("---------------client code save at " + stubcodeTargetPath + ".--------------"); WSDLToJava w2j = null; String bindingPath = URLDecoder.decode(ClientCodeGenerator.class.getResource("").getPath()).substring(1) + "anyc_binding.xml"; System.out.println(bindingPath); if ("true".equals(async)) w2j = new WSDLToJava(new String[] { "-client", "-d", stubcodeTargetPath, "-b", bindingPath, serviceWsdlUrl }); else w2j = new WSDLToJava(new String[] { "-client", "-d", stubcodeTargetPath, serviceWsdlUrl }); w2j.run(new ToolContext()); System.out.println("---------------client code generate finished.--------------"); } catch (Exception e) { e.printStackTrace(); } } }
2. 配置文件 ws-client-config.properties
#服务端wsdl文件本地路径或者wsdl地址 ws.client.serviceWSDLUrl=http://127.0.0.1:8080/test/service/TestAyncService?wsdl #客户端代码需要存储的位置 ws.client.stubCodeTargetPath=c\: #是否生成异步代码 ws.client.async=false
3. anyc_binding.xml 用于生成异步客户端代码的配置文件(可无视,与此主题无关)
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="http://127.0.0.1:8080/test/service/TestAyncService?wsdl" xmlns="http://java.sun.com/xml/ns/jaxws"> <bindings node="wsdl:definitions"> <enableAsyncMapping>true</enableAsyncMapping> </bindings> </bindings>
执行java工具类即可生成客户端代码。
PS:org.apache.cxf.tools.wsdlto.WSDLToJava类的参数与wsdl2java命令的参数格式相同