调用WebService接口的方法有两种,
第一种就是RPC方式,很复杂
第二种用命令生成客户端代码方式调用,比较方便
使用RPC方式调用WebService的步骤如下:
1)创建RPCServiceClient对象
2)创建EndpointReference对象,并指定要访问WebService的URL(不包含wsdl)
3)创建QName对象,并指定要调用的WebService方法
4)创建描述WebService方法参数值的Object[]对象
5)创建描述WebService方法返回值类型的Class[]对象
6)使用RPCServiceClient类的invokeBlocking方法调用WebService方法
注意:invokeBlocking方法返回一个Object[]对象,如果方法返回单值,可以引用Object[]对象的第一个元素,也就是Object[0]
package client; import org.apache.axis2.rpc.client.RPCServiceClient; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; public class MyClient { public static void main(String[] args) throws AxisFault { /** 调用webser中nextNum方法 **/ //第一步 创建RPCServiceClient对象 RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); //第二步 远程wsdl文件 EndpointReference target = new EndpointReference( "http://localhost:8080/axis2/services/JaxWSImplService"); options.setTo(target); //第三步 命名空间和方法 QName addEntry = new QName("http://impl.service.jax/", "sayHello"); //第四步 传入方法的参数,没有的话定义空数组 Object[] addEntryArgs = new Object[]{ "shanshanbox.com" }; //第五步 方法的返回值,可以不存在 Class[] classes = new Class[] {String.class}; Object[] invokeBlocking = serviceClient.invokeBlocking(addEntry, addEntryArgs, classes); System.out.println(invokeBlocking[0]); /** 调用webser中nextNum方法 **/ addEntry = new QName("http://impl.service.jax/", "nextNum"); classes = new Class[] { int.class }; invokeBlocking = serviceClient.invokeBlocking(addEntry, new Object[]{ }, classes); System.out.println(invokeBlocking[0]); } }
使用RPC方式调用WebService应注意如下几点:
1)客户端需要引用必要的jar包,反正我是把axis2的lib文件夹下所有的jar文件引入
2)上面的代码中使用RPCServiceClient类的invokeBlocking方法调用WebService方法。
invokeBlocking方法有三个参数,其中第一个类型是QName对象,表示要调用的方法;第二个
参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService
方法的返回值类型的Class对象,参数类型为Class[],当方法没有参数时,invokeBlocking方法的
第二个参数值不能为null。要使用new Object[]()
3)调用的WebService没有返回值,应使用RPCService类的invokeRobust方法,该方法只有两个参数
4)在创建QName对象时,QName类的构造方法的第一个参数表示WSDL的命名空间,也就是<wsdl definitions>元素的targetNamespa属性值
5)如果出现如下这种错误
Exception in thread "main" org.apache.axis2.AxisFault: The ServiceClass object does not implement the required method in the following form: OMElement sayHello(OMElement e)
请检查一下你的services.xml配置文件是否正确,如下格式
<service name="simpleService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> com.hous.service.SimpleService </parameter> <!-- 这里没有正确配置 --> <operation name="sayHello"> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="nextNum"> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
Game Over You Are Win