我对webservice一直觉得很陌生很难理解,工作中遇到了需要使用webservice的情况只好硬着头皮去做。
我做了一个webservice接口:
ePolicyCallBackWSDD.java:
public class ePolicyCallBackWSDD {
public static Logger logger = Logger.getLogger(ePolicyCallBackWSDD.class);
public synchronized int saveCallBackPolicy(CallBackPolicyInfo cbpi){
CallBackWSDDService wsd=new CallBackWSDDService();
int rt=wsd.saveCallBackPolicy(cbpi);
System.out.println(rt);
logger.info("saveCallBackPolicy:return="+rt);
return rt;
}
CallBackWSDDService.java:
public int saveCallBackPolicy(CallBackPolicyInfo cbpi) {
SessionHibernate bhd = new SessionHibernate();
BaseHibernateDAO bd=new BaseHibernateDAO();
........................
//保存CallBackPolicyInfo参数,返回结果
}
在server-config.wsdd 文件中做了如下配置:
<service name="ePolicyCallBackWSDD" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="request"/>
<parameter name="className" value="com.generaliChina.callCenter.callBack.webService.ePolicyCallBackWSDD"/>
</service>
以为万事大吉,把接口地址给客户端同事让他测试,结果报错:
org.xml.sax.SAXException: Deserializing parameter 'cbpi': could not find deserializer for type {http://business.hibernate.callBack.callCenter.generaliChina.com}CallBackPolicyInfo
客户端同事问我能不能把参数改一下,不要使用对象,用数组或者列表,我不死心,觉得总会找到报错原因的,就去查资料,找到了如下答案:
错误提示已经很明确了说你的方法中的book变量没有指定消息解析器,对于自定义类型(即自定义类)必须指定解析器否则AXIS不知道如何把SOAPMessage和方法参数之间进行转换,在wsdd部署文件中的该服务的<service></service>中增加子元素:
<beanMapping qname="myNS:Book" xmlns:myNS="urn:BookService" languageSpecificType="java:Book类的完全类名称"/>
我试着改了一下,在server-config.wsdd文件中作了修改:
<service name="ePolicyCallBackWSDD" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> <parameter name="className" value="com.generaliChina.callCenter.callBack.webService.ePolicyCallBackWSDD"/> <beanMapping qname="myNS:CallBackPolicyInfo" xmlns:myNS="urn:ePolicyCallBackWSDD" languageSpecificType="java:com.generaliChina.callCenter.callBack.hibernate.business.CallBackPolicyInfo"/> </service>
再次测试,ok!很激动,感谢万能的网友。
原文地址如下:
https://zhidao.baidu.com/question/121567050.html