欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过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命令的参数格式相同