我是个对webservice,axis原理一点都不了解的人,可没办法老大安排下来这样的任务,只有google先模模糊糊了解一下,再寻求同事们的帮助,生成相应的WSDD等文件,对里面的一些key,value值对都不懂,为什么key是它,对应的值又为什么是它,只有看着值去猜想。
服务器端生成了,接着就进行相应的客户端调用测试,事实并不那么如我想像简单,抛出了org.xml.sax.SAXParseException: The root element is required in a well-formed document. 异常,不懂,这是什么意思,再看看后台,说XXX类没有被序列化(因为我的返回结果是自定义的bean,所以才会有此问题),本想着找到原因就不怕了,进入google,都是说要在server-config.wsdd文件的自配<service>中加入typemapping项配置,于是又进一步的查找,看前辈们都是怎么配置的,好,我加上了,却又抛出了另一个Exception,问题还是不能解决哎!真是唔呼唉哉!怎么就会有这么多的问题呢,看看时间,两三个小时就这样过去了。请教有经验的同事,都说没碰到过这个问题,没办法,只有耐着性子继续找原因,修改,测试,不断的重复着,嗯!嗯!还好,就在耐心快要被磨灭的同时,问题有了新的进展,抛出了org.xml.sax.SAXException: No deserializer for ... (不能被反序列化)这个Exception,前面看到了希望,给了我力量继续寻找亮光,终于,找到一个我觉得和我所出的问题一样的解决办法,依葫芦画瓢,OK,SUCCESS!具体解决办法:
没有加typemapping项,而是加的beanMapping项。如下:
<beanMapping languageSpecificType="java:package.XxxBean " qname="ns1:xxxBean" xmlns:ns1="http://localhost:8000/services/MySvc" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
在这里有个问题就是qname="ns1:xxxBean" ,xxxBean不是XxxBean!!!!
我去掉typemapping,保留beanmapping!!!然后建立client测试,代码如下:
public class TestClient ...{
public static void main(String[] args) ...{
String endPoint = "http://localhost:8000/services/MySvc";
Call call = null;
try {
Service service = new Service();
call = (Call) service.createCall();
QName qn = new QName(endPoint,"xxxBean");
call.registerTypeMapping(XxxBean.class, qn, new BeanSerializerFactory(XxxBean.class,qn), new BeanDeserializerFactory(XxxBean.class,qn));
call.setTargetEndpointAddress(endPoint);
call.setOperationName(new QName(endPoint, "executMyMethod"));
return (java.lang.Object[])call.invoke(new Object[]{});
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
这里也要注意的是
QName qn = new QName(endPoint,"xxxBean");
也要与配置文件server-config.wsdd中的对应,xxxBean也不是XxxBean!!!!!然后就是注册对这个namespace命名的类进行加序列,解序列工厂类!!
QName qn = new QName(endPoint,"xxxBean");
call.registerTypeMapping(XxxBean.class, qn, new BeanSerializerFactory(XxxBean.class,qn), new BeanDeserializerFactory(XxxBean.class,qn));
这是地网上找到了一个范例,然后参照修改,就此问题终于解决了!如果再有碰到此问题同仁可以就此借鉴一下,按照上面的都做了,如果还是抛出Exception,那就要看看你的调用方法了,是不是把call.setOperationName写成了call.setOperation这两个方法差别是很大的哦!!!!!!