zoukankan      html  css  js  c++  java
  • [转载]axis2通过wsdl生成客户端程序并本地调用

    下载axis2-1.5.4-bin.zip文件并解压。

    设置axis2的环境变量,如下图所示:[转载]axis2通过wsdl生成客户端程序并本地调用

    利用axis2中的wsdl2java.bat生成客户端程序。

    先启动Tomcat7并在IE里运行http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl 看看服务端是否正常解析。

    %AXIS2_HOME%binwsdl2java -uri http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server -o stub

    其中-uri参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,可以找到一个HelloServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。
    运行-->cmd-->具体命令如下:

    要先进入axis2的bin目录然后运行wsdl2java.bat

    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.

    C:Documents and SettingsJambhala>d:

    D:>cd D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4bin

    D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4bin>wsdl2java -uri http://l
    ocalhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server -o
    stub
    Using AXIS2_HOME:   D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4
    Using JAVA_HOME:    C:Javajdk1.6.0
    Retrieving document at 'http://localhost:8081/TestAxis2Ws/services/HelloService?
    wsdl'.
    D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4bin>
    这时到axis2的bin目录下会发现出现了一个stub目录,如下图所示:[转载]axis2通过wsdl生成客户端程序并本地调用

    [转载]axis2通过wsdl生成客户端程序并本地调用

    [转载]axis2通过wsdl生成客户端程序并本地调用

    其中HelloServiceStub.java是客户端程序,HelloServiceCallbackHandler.java是异步客户端程序。

    把这两个类复制到上次已经建立好的服务端工程里,如下图所示:

    要参考上一次写的MyEclipse整合Axis2插件的文章(http://shihuan830619.iteye.com/blog/1136607)

    [转载]axis2通过wsdl生成客户端程序并本地调用

    注意:这个地方复制进来后会报错的,因为在D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4binstubsrcaxis2serviceserver下的类路径为package axis2.service.server;需要改成package axis2.service.client;并且需要把HelloServiceStub.java和HelloServiceCallbackHandler.java相关的报错位置都把路径改一下,不要闲烦,要改的地方还满多的呢。

    创建带main方法的StubClient.java类文件,代码如下:

    package axis2.service.domain;

    import java.rmi.RemoteException;

    import org.apache.axis2.AxisFault;

    import axis2.service.client.HelloServiceStub;

    public class StubClient {

     
     public static void main(String[] args) {
      HelloServiceStub stub = null;
      try {
       stub = new HelloServiceStub();
       HelloServiceStub.SayHello sh = new HelloServiceStub.SayHello();
       sh.setName("于士博");
       System.out.println(stub.sayHello(sh).get_return());
      } catch (AxisFault e) {
       e.printStackTrace();
      } catch (RemoteException e) {
       e.printStackTrace();
      }
     }

    }

    运行后会看到如下结果:

    log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
    log4j:WARN Please initialize the log4j system properly.
    Hello, 于士博!

     

    解释:

    上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名(SayHello)为方法名,例如,sayHello方法的参数都封装在了SayHello类中,要想调用sayHello方法,必须先创建SayHello类的对象实例。

     

    --------------------------------------------------------------------------------------------------

    下面介绍纯手动编写Java代码客户端程序:

    package axis2.service.domain;

    import javax.xml.namespace.QName;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.rpc.client.RPCServiceClient;

    public class HelloClient {

     
     public static void main(String[] args) {
      
      //使用RPC方式调用WebService 

      RPCServiceClient serviceClient = null;
      try {
             serviceClient = new RPCServiceClient();
             Options options = serviceClient.getOptions();
             //指定调用WebService的URL
             EndpointReference targetEPR = new EndpointReference("http://localhost:8081/TestAxis2Ws/services/HelloService");
             options.setTo(targetEPR);
             //指定sayHello方法的参数值
             Object[] opAddEntryArgs = new Object[] {"于士博"};
             //指定sayHello方法返回值的数据类型的Class对象
             Class[] classes = new Class[] {String.class};
             //指定要调用的sayHello方法及WSDL文件的命名空间
             QName opAddEntry = new QName("http://server.service.axis2", "sayHello");
             //调用sayHello方法并输出该方法的返回值

             String result = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

                             [0].toString();

             serviceClient.cleanupTransport();  //为了防止连接超时
             System.out.println(result);
             //System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

               [0]);
      } catch (AxisFault e) {
       e.printStackTrace();
      }
      
     }

    }

     

    【注】:在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。

            invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个

            参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的

            返回值类型的Class对象,参数类型为Class[]。

            当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}

            如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只

            有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

            在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是

            <wsdl:definitions>元素的targetNamespace属性值。

  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480370.html
Copyright © 2011-2022 走看看