解决java用axis调用.NET写的webService中遇到的各种Exception

来源:互联网 发布:mysql取最近一条记录 编辑:程序博客网 时间:2024/05/20 03:07

当我使用网上最简单的axis连接webService时(代码如下):

import javax.xml.rpc.ParameterMode;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;......private static String WSURL = "http://xxx/SendWebService.asmx"private static void invoke(String method, String[] params, Object[] values) {        try {    //创建一个服务        Service service = new Service();        //建立服务调用实例Call call = (Call) service.createCall();        //设定调用路径        call.setTargetEndpointAddress(new URL(WSURL));        //设定调用方法        call.setOperation(method);        call.setReturnType(XMLType.XSD_STRING);        for (String param:params) {        call.addParameter(param, XMLType.XSD_STRING, ParameterMode.IN);        }        String result = (String) call.invoke(values);    } catch (Exception e) {e.printStackTrace();result = null;}}

抛出异常 服务器未能识别 HTTP 头 SOAPAction 的值: 。

后来得知需要加上

call.setUseSOAPAction(true);call.setSOAPActionURI(NAMESPACE + method);
这两句代码  其中NANESPACE 就是你用浏览器打开WSURl路径加上?wsdl,即http://xxx/SendWebService.asmx?wsdl 中的targetNamespace属性值
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.

我又找了很多资料,最后才得知是返回类型和自己接受的没有匹配。

所以call.setReturnType(XMLType.XSD_SCHEMA);//也可能是别的类型

最后为了严谨,用上了QName

最后代码如下:

import java.net.URL;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.xml.namespace.QName;  import javax.xml.rpc.ParameterMode;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;import org.apache.axis.message.MessageElement;import org.apache.axis.types.Schema;private static String WSURL = "http://xxx/SendWebService.asmx";private static String NAMESPACE = "http://xxx/WebSms1037test/";/**     * 执行一次 ws     * @param method 接口名     * @param params 传入的参数名     * @param values 传入的参数值     * @return Map     */    private static Map invoke(String method, String[] params, Object[] values) {    Map result = null;    Schema schema = null;    try {    //创建一个服务        Service service = new Service();        //建立服务调用实例Call call = (Call) service.createCall();        //设定调用路径        call.setTargetEndpointAddress(new URL(WSURL));        call.setUseSOAPAction(true);         //设定调用方法        call.setOperationName(new QName(NAMESPACE, method));        call.setSOAPActionURI(NAMESPACE + method);        call.setReturnType(XMLType.XSD_SCHEMA);        for (String param:params) {        call.addParameter(new QName(NAMESPACE, param), XMLType.XSD_STRING, ParameterMode.IN);        }        schema = (Schema) call.invoke(values);        MessageElement[] msgele = schema.get_any();                  List<MessageElement> msgElmtHead = msgele[0].getChildren();// 消息头,DataSet对象                  result = new HashMap<>();                for (MessageElement element : msgElmtHead) {                         result.put(element.getName(), element.getValue());                }    } catch (Exception e) {                e.printStackTrace();                result = null;        }        return result;    }
0 0
原创粉丝点击