[转载]axis2通过wsdl生成客户端程序并本地调用
下载axis2-1.5.4-bin.zip文件并解压。
利用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
D:WebServiceAxisaxis2axis2
ocalhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server
-o
stub
Using AXIS2_HOME:
Using
JAVA_HOME:
Retrieving document at
'http://localhost:8081/TestAxis2Ws/services/HelloService?
wsdl'.
D:WebServiceAxisaxis2axis2
这时到axis2的bin目录下会发现出现了一个stub目录,如下图所示:
其中HelloServiceStub.java是客户端程序,HelloServiceCallbackHand
把这两个类复制到上次已经建立好的服务端工程里,如下图所示:
要参考上一次写的MyEclipse整合Axis2插件的文章(http://shihuan830619.iteye.com/blog/1136607)
注意:这个地方复制进来后会报错的,因为在D:WebServiceAxisaxis2axis2
创建带main方法的StubClient.java类文件,代码如下:
package axis2.service.domain;
import java.rmi.RemoteException;
import org.apache.axis2.AxisFault;
import axis2.service.client.HelloServiceStub;
public class StubClient {
}
运行后会看到如下结果:
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 {
}
【注】:在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。