`
hetaoo
  • 浏览: 104790 次
社区版块
存档分类
最新评论

[转]从WSDL文档中生成客户端支持代码

阅读更多

通过java提供的“wsimport”工具可以很容易完成基于SOAP协议的web服务客户端生成工作。这个工具可以从对应的WSDL文档的服务描述中生成客户端支持代码或其它相关资源。输入并执行如下命令:

1
% wsimport

 

执行后,将会打印出该命令程序的使用帮助。下面我们将通过命令工具对前面的例子TimeServer服务生成客户端开发相关支持代码。启动ch01.ts.TimeServerPublisher程序后,执行如下命令:

1
% wsimport -keep -p client http://localhost:9876/ts?wsdl

 

执行后将会在“client”子目录下面产生两个源代码文件和两个与之对应的已经编译好的Class文件。“-p”选项用来指定生成的java包名称,此处使用“client”作为包名称。包名称可以是符合java包命名规则的任何名称,wsimport工具通过指定的包名称创建包对应子目录。“-keep”选项用来指示是否保留编译后的源文件,这个例子中,我们保留源文件留作验证。“-p”选项是比较重要的,这是由于wsimport命令产生的TimeServer.class文件名称同先前编译的服务端点接口(SEI)拥有同样的名字。如果没有指定包名称,wsimport默认使用服务器实现的包名称作为客户端代码包名称,此处将默认用“ch01.ts”作为包名称。简单来说,使用“-p”选项可以防止编译好的SEI文件不被wsimport工具产生的文件覆盖。如果已经将WSDL文档保存在本地(比如,文件被命名为ts.wsdl),那么,wsimport可以写成:

1
% wsimport -keep -p client ts.wsdl

 

生成的代码示例如下,由wsimport生成的TimeServer服务接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package client;
 
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Action;
 
/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.4-b01
 * Generated source version: 2.2
 */
@WebService(name = "TimeServer", targetNamespace = "http://ts.ch01/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface TimeServer {
    /**
     * @return
     * returns java.lang.String
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://ts.ch01/TimeServer/getTimeAsStringRequest"
        output = "http://ts.ch01/TimeServer/getTimeAsStringResponse")
    public String getTimeAsString();
 
    /**
     * @return
     * returns long
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://ts.ch01/TimeServer/getTimeAsElasedRequest"
        output = "http://ts.ch01/TimeServer/getTimeAsElasedResponse")
    public long getTimeAsElased();
}

 

由wsimport生成的TimeServerImplService实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package client;
 
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
 
/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.4-b01
 * Generated source version: 2.2
 */
@WebServiceClient(name = "TimeServerImplService", targetNamespace = "http://ts.ch01/"
    wsdlLocation = "http://localhost:9876/ts?wsdl")
public class TimeServerImplService extends Service{
 
    private final static URL TIMESERVERIMPLSERVICE_WSDL_LOCATION;
    private final static WebServiceException TIMESERVERIMPLSERVICE_EXCEPTION;
    private final static QName TIMESERVERIMPLSERVICE_QNAME = 
            new QName("http://ts.ch01/""TimeServerImplService");
 
    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://localhost:9876/ts?wsdl");
        catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        TIMESERVERIMPLSERVICE_WSDL_LOCATION = url;
        TIMESERVERIMPLSERVICE_EXCEPTION = e;
    }
 
    public TimeServerImplService() {
        super(__getWsdlLocation(), TIMESERVERIMPLSERVICE_QNAME);
    }
 
    public TimeServerImplService(WebServiceFeature... features) {
        super(__getWsdlLocation(), TIMESERVERIMPLSERVICE_QNAME, features);
    }
 
    public TimeServerImplService(URL wsdlLocation) {
        super(wsdlLocation, TIMESERVERIMPLSERVICE_QNAME);
    }
 
    public TimeServerImplService(URL wsdlLocation, WebServiceFeature... features) {
        super(wsdlLocation, TIMESERVERIMPLSERVICE_QNAME, features);
    }
 
    public TimeServerImplService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }
 
    public TimeServerImplService(URL wsdlLocation, QName serviceName, 
            WebServiceFeature... features) {
        super(wsdlLocation, serviceName, features);
    }
 
    /**
     * @return
     * returns TimeServer
     */
    @WebEndpoint(name = "TimeServerImplPort")
    public TimeServer getTimeServerImplPort() {
        return super.getPort(new QName("http://ts.ch01/""TimeServerImplPort"), 
            TimeServer.class);
    }
 
    /**
     * @param features
     * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  
     * Supported features not in the <code>features</code> parameter will have 
     * their default values.
     * @return
     * returns TimeServer
     */
    @WebEndpoint(name = "TimeServerImplPort")
    public TimeServer getTimeServerImplPort(WebServiceFeature... features) {
        return super.getPort(new QName("http://ts.ch01/""TimeServerImplPort"), 
            TimeServer.class, features);
    }
 
    private static URL __getWsdlLocation() {
        if (TIMESERVERIMPLSERVICE_EXCEPTION!= null) {
            throw TIMESERVERIMPLSERVICE_EXCEPTION;
        }
        return TIMESERVERIMPLSERVICE_WSDL_LOCATION;
    }
}

 

由wsimport产生的源文件有3点需要注意。第一,客户端接口client.TimeServer定义了同目标SEI接口TimeServer相同的方法。这些方法包括服务请求操作getTimeAsString和getTimeAsElapsed两个方法。第二,实现类client.TimeServerImplService包括一个无参构造函数,同目标Java客户端TimeClient中构造服务对象时非常地类似。第三,TimeServerImplService类封装了getTimeServerImplPort方法,该方法返回一个client.TimeServer对象实例,该对象实例支持对两个预先定义的web服务操作的调用。

下面利用wsimport工具产生的客户端支持代码来调用web服务,如例:

1
2
3
4
5
6
7
8
9
10
11
12
13
package client;
/**
 * 使用wsimport生成的代码编写的java服务调用客户端
 * @author fuhd
 */
public class TimeClientWSDL {
    public static void main(String[] args) {
        TimeServerImplService service = new TimeServerImplService();
        TimeServer server = service.getTimeServerImplPort();
        System.out.println(server.getTimeAsElased());
        System.out.println(server.getTimeAsString());
    }
}

 

上面示例中的服务调用客户端和前面的TimeClient客户端在功能上是一样的,但是这个客户端编写起来却非常容易。尤为重要的是,在使用wsimport工具生成client.TimeServerImplService时,像与服务对应的QName和服务端点等这些复杂的细节都被隐藏掉了。

下面是针对采用基于WSDL协议所生成的相关工件(Artifact)编写服务客户端的一些常用做法,比如像这里的TimeServer和TimeServerImplService。

  • 首先,通过wsimport产生的类中的几个构造方法构造服务对象,比如在本例的client.TimeServerImplService类中,无参数的构造方法更可取,因为这样更为简单。然而,在本例中,还是生成了几个拥有多个输入参数的构造方法,用来适应web服务的命名空间(URI)或服务端点(RUL)等变化。当然还可以通过wsimport工具包重新生成基于WSDL的java文件,用在其他客户端开发中。

  • 通过构建的服务对象调用对应的get系列方法,在本例中是getTimeServerImplPort方法。这个方法返回一个封装了web服务操作方法的对象,本例中分别是定义在目标SEI中的getTimeAsString和getTimeAsElapsed方法。

 

分享到:
评论

相关推荐

    利用wsdl.exe生成webservice代理类

    默认情况下,生成客户端代理 类。 /serverInterface 为 ASP.Net Web 服务的服务器端实现生成 接口。将为 wsdl 文档中的每个绑定生成 一个接口。wsdl 单独实现 wsdl 协定(实现 接口的类在类方法上不应包括下列...

    利用Zend Studio for Eclipse生成wsdl文件,php调用web service

    该文档详细描述了利用Zend Studio for Eclipse 生成wsdl文件,用php编写提供web service 的服务程序,然后用php调用,亲测通过

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     上面的命令根据制定URL提供的WSDL文档生成一个C++语法结构的头文件。  如果需要生成一个纯C的头文件,需要一下命令:  $ wsdl2h -c -o quote.h  更多关于WSDL解析器及其选项的细节信息,请参见8.2.10节。  ...

    CXF框架应用在Web项目中

    Ⅰ)调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码(任何语言实现web service都要暴露WSDL文档); Ⅱ)找到wsdl2java所生成的类中一个继承了Service的类(该类的实例可当工厂使用); Ⅲ)调用...

    JAX-WS自学笔记

    本人自学JAX-WS笔记和简单例子,文档标题结构如下: JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 ...

    WebService之JAX-WS自学笔记

    2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3发布Web Service 2.3.1在应用程序中发布 2.3.2在Web应用程序中发布 2.3.2.1 依赖包 ...

    Axis1.4生成webservice客户端 Axis1.4包及使用方法

    1. 将lib包下的所有的jar包,添加到classpath中。 2. 运行命令: java org.apache.axis.wsdl.WSDL2Java -u http://xxxxxx?wsdl -p com.webservice.wsdl -t... -t 生成的java文件中包含junit的测试代码。 详见文档。

    gsoap 2.8.71

    gSOAP工具根据WSDL文档,自动生成C/C++语言的客户端/服务端框架代码。这其中有两个工具很重要,wsdl2h和soapcpp2。wsdl2h工具根据WSDL文成C/C++头文件,而soapcpp2工具则是根据该头文件生成C/C++的框架源码。 gSOAP...

    gsoap 2.8.82

    gSOAP工具根据WSDL文档,自动生成C/C++语言的客户端/服务端框架代码。这其中有两个工具很重要,wsdl2h和soapcpp2。wsdl2h工具根据WSDL文成C/C++头文件,而soapcpp2工具则是根据该头文件生成C/C++的框架源码。 gSOAP...

    axis-bin-1_4.zip

    WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。 初步提供安全扩展,能够与Servlet2.2安全集成。 通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。 初步支持带附件的SOAP消息。 在...

    gsoap开发案例 VC实现

    一个gsoap 实现加法的例子,用VC6.0开发,包含服务器端和客户端。另外还附wsdl文档,gsoap生成代码工具

    xmlspy.2013-patch

    它提供了世界领先的XML编辑器,在原图形架构设计师,一个代码生成器,文件转换器,调试器,分析器,完整的数据库集成,支持WSDL,SOAP,XSLT,XPath,XQuery,XBRL,Open XML文档,加上视觉Studio和Eclipse插件,...

    altova-xmlspy-enterprise-2010-v12-3

    它提供了世界领先的XML编辑器,在原图形架构设计师,一个代码生成器,文件转换器,调试器,分析器,完整的数据库集成,支持WSDL,SOAP,XSLT,XPath,XQuery,XBRL,Open XML文档,加上视觉Studio和Eclipse插件,...

    soapjava客户端源码-vba_client_demo:vba_client_demo

    身份认证服务平台自建接口WSDL文件生成Stub代码的示例源代码版本,是框架和构建工具无依赖的纯eclipse工程。jdk版本兼容1.7及以上。 接口文档见 TomcatClient 身份认证服务平台自建接口master-https_单笔身份认证...

    oXygen XML Editor(XML脚本编辑软件)

    oXygen XML Editor是一个多平台的XML编辑器(里诺下载站提供),XSLT / XQuery的调试器和分析器具有...oXygen支持导入数据库内容,微软Excel表和传统的文本数据文件到XML文档,也为从数据库表生成XML Schema的支持。

    Axis2+eclipse开发webservice总结

    本文档从在eclipse下配置axis2开发环境,到编写服务器接口,使用axis2的server wizard发布aar文件的方式,及编写客户端代码访问arr接口的方式;另一种是在要发布的类上使用右键--&gt;webservice--&gt;创建webservice,发布...

    WsdlToPhp:转到 https

    它从 WSDL 及其模式中检索文档标签,并定义使用的方法、返回类型、参数类型等。 在这里在线测试这个库: : 在此处在线阅读 PHPDoc: :教程了解如何使用此代码的最佳方法是首先查看位于根目录中的 samples-...

    stax2-api-3.1.4 VS woodstox-core-asl-4.4.0

    框架开发WebService,WebService服务器端发布成功,通过浏览器也可以顺利生成wsdl文档,但是通过wsdl2java把服务器端java代码引入到客户端以后,写Test类调用服务器端的接口,一直抛java.lang.RuntimeException: ...

    JAVA程序开发大全---上半部分

    14.4.2 使用WSDL生成客户端代码 253 14.4.3 创建Web Service客户端测试代码 255 14.5 本章小结 255 第15章 Java EE中EJB的开发 256 15.1 EJB概述 256 15.2 WebLogic服务器的安装与配置 257 15.2.1 WebLogic服务器的...

    JAVA.WEB服务.构建与运行

    2.2 wsdl文档结构 36 2.3 amazon e-commerce web服务 46 2.4 wsgen工具与jax-b工件(artifacts) 59 2.5 wsdl总结 69 2.6 下一章 80 .第3章 soap消息编程 81 3.1 soap是否真地不可见 81 3.2 在soap 1.2下实现...

Global site tag (gtag.js) - Google Analytics