通过cxf的wsdl2java的API生成webservice客户端代码

      项目框架中要增加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命令的参数格式相同

相关推荐