让美的事情发生
Ziv 小威
Java 利用 Axis 远程调用 WebService 接口

准备工作:

  主要依赖的包:

  1.axis.jar

  官网:http://axis.apache.org/axis/

  2.jaxrpc.jar

  下载地址:http://www.java2s.com/Code/Jar/j/Downloadjaxrpcjar.htm

说明:

  在拿到 wsdl 地址后先分析清楚 xml 文件的一些参数,然后再动手写代码,例如 service 名称,targetNamespace,请求 operation 的名称,要传入的参数类型,返回结果类型等等。具体的代码参考如下:

1 package com.joysee.account.service.impl;
 2
 3
 4 import java.rmi.RemoteException;
 5
 6 import javax.xml.namespace.QName;
 7 import javax.xml.rpc.ParameterMode;
 8 import javax.xml.rpc.ServiceException;
 9
10 import org.apache.axis.client.Call;
11 import org.apache.axis.client.Service;
12
13
14 public class Test {
15
16     /**
17      * @param args
18      * @throws ServiceException
19      * @throws MalformedURLException
20      * @throws RemoteException
21      */
22     public static void main(String[] args) throws ServiceException, RemoteException {
23
24         //WSDL地址
25         String wsdlUrl ="http://IP:PORT/ExampleWebService?wsdl";  
26         //看具体响应的WSDL中的namespace
27         String nameSpaceUri ="http://ws.exmaple.com/";
28
29         Service service = new Service();
30
31         Call call = (Call)service.createCall();
32         call.setTargetEndpointAddress(wsdlUrl);
33
34         //设置operation 名称,
35         call.setOperationName(new QName(nameSpaceUri, "order"));
36
37         //设置账户,注意参数为XSD_STRRING
38         call.addParameter("account", org.apache.axis.Constants.XSD_STRING,
39                 ParameterMode.IN);
40
41         //设置账户,注意参数为XSD_LONG
42         call.addParameter("price", org.apache.axis.Constants.XSD_LONG,
43                 ParameterMode.IN);
44
45         //设置返回类型为对象数组
46         call.setReturnClass(Object[].class);
47
48         Object[] result = (Object[]) call.invoke(new Object[]{"test","123456"});
49
50         System.out.println(result[0]);
51
52     }
53
54 }

常见异常:

1.org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType

  这个异常需要检查 call.setReturnClass(); 中的类型,或者是 setReturnType()

  1. Unexpected wrapper element order found.

 可以检查 setOperationName 中的 QName 参数,其中的 NameSpace 地址是不是有问题,或者 operation 名是否有误


最后修改于 2014-03-26

Comments powered by Disqus