解决基于axis的webservice问题

    我是个对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这两个方法差别是很大的哦!!!!!!
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值