Java調用ASP.NET的webservice故障排除
公司要接入其它公司的一個業務功能,對方是提供的 .net產生的webservice,在用cxf的wsdl2java命令生成客戶端的測試代碼時,出現了如下故障
WSDLToJava Error: Thrown by JAXB: undefined element declaration 's:schema'
於是在網上查詢大量資料和不斷實踐摸索后,最后發現了如下兩種解決方法,希望我的解決過程和總結,能對其它網友解決類似問題,提供借簽和參考作用。
第一種方式(仍用cxf 解決)
step1
將 http://test.payserv.net/Paygate/ccservice.asmx?WSDL 對應的內容另存為 ccservice.wsdl

這里要特別說明的是,只能通過網頁中另存為ccservice.wsdl,不能簡單的將網頁中的復制后,再粘貼到一個文本文件中,另存為 ccservice.wsdl,這樣即使經過下述的 step2后,仍然會報錯
step2
首先將 ccservice.wsdl文件中的如下內容進行如下替換
即將 <s:element ref="s:schema" /><s:any /> 替換成 <s:any minOccurs="2" maxOccurs="2"/>

這樣處理后,再次運行wsdl2java又報了如下錯誤

經過仔細查看和分析,原來在
ccservice.wsdl文件中,有queryResponse 和 QueryResponse 兩個名字的定義,可能在.net中webservice是不區分大小寫的,但是在java中生成webservice的客戶端時,又是區分大小寫的,所以會報上述錯誤。針對此,於是將其中的QueryResponse的名字改為了 QueryResponse1,且在
ccservice.wsdl文件中將所有引用QueryResponse的地方也改成了QueryResponse1。。然后再將運行就一切ok啦


總結一下
在用cxf的wsdl2java命令處理net或其它語言產生的webservice時,如出現報錯,要仔細觀察報錯信息的描述,通過自己思考和查詢網絡資源,有針對性的修改,一定是可以解決的。
第二種方式(用axis的webservice框架 解決)
從我測試來看,不需要任何修改即可生成websercie的客戶端
不過,要需要axis如下一些jar包才能保證axis產生的webservice的客戶端代碼正常運行
總結一下
如果用時候發現用cxf的 wsdl2java命令不能正常執行時,不妨考用axix之類的其它webservice框架來解決問題,換一個角度去解決問題。
調用方式
Ccservice ccservice = new Ccservice();
CcserviceSoap ccserviceSoap = ccservice.getCcserviceSoap();
ccserviceSoap.query(參數1,參數2,...);