webservice用戶端異常( undefinedelement declaration ‘s:schema’)

來源:互聯網
上載者:User

原文地址:代碼人生(http://wensiqun.iteye.com/blog/1083340)

今天在使用CXF的wsdl2java.bat根據wsdl檔案產生用戶端調用時出現以下錯誤: WSDL To Java Error: Thrown by JAXB: undefined element declaration's:schema' at line 49 column 19 of schemafile:/D:/workspace/webservice/weather/wsdl/weather.wsdl 

因為也是臨時接觸CXF,所以一時不知是什麼問題,在網上搜了半天,都是說要替換什麼內容之類的,但也沒說為什麼,而且基本都是轉載國外某人的一個文章,只知其然不知其所以然就失去了做技術工作的意義了,因為長此這樣是不可能提升自己的。所以決心瞭解下為什嗎? 

根據錯誤提示似乎是找不到s:schema,查看了一下.net產生的wsdl檔案,在檔案頭部有s:schema命名空間的定義: 

xmlns:s=http://www.w3.org/2001/XMLSchema 

但同時也發現CXF產生的wsdl檔案也用到了類似的元素,只不過定義的命名空間名稱略有差異:xmlns:xs=http://www.w3.org/2001/XMLSchema 

因此基本可以排除找不到s:schema元素的問題原因肯定不是XML本身定義的問題了。

緊接著又看了下wsdl的引入是否會存在版本問題,在對比了JAVA和.NET的WSDL檔案後,感覺版本也應該是一致的。因此wsdl的版本原因也可以排除。

http://schemas.xmlsoap.org/wsdl/ (java) 

http://schemas.xmlsoap.org/wsdl/soap/(.net) 

經過思考,決定從“在一個xml設定檔中ref表示什麼意思“這個思路入手。查了一篇老外的文章後,大致明白了其作,ref相當於一個引用的意思,具體可見如下例子: 

<element name="foo"> <complexType> <element ref="a:bar"/> </complexType> </element> <element name="bar"type="string"/> 

equivalent to this: 

<element name="foo"> <complexType> <element name="bar"type="string"/> </complexType> </element> 

當明白了ref的作用後,我很自然地就想到wsdl2java是通過JAXB解析wsdl檔案的,那會不會是JAXB目前還不支援ref 這種元素的解析呢,從網上找到一篇文章 還是ORACLE官網上的“xsd:element ref not working with jaxb”似乎為我的想提供了佐證,在國外的一些文章上對待這樣的錯誤有如下的解決辦法:用<s:any minOccurs="2" maxOccurs="2"/>替代<s:element ref="s:schema"/><s:any /> ,我試了下果然可以,因此我基本上可以個人武斷地認為這個wsdl2java的建置錯誤應該是和JAXB不支援xml的ref有關。因為

<s:any minOccurs="2"maxOccurs="2"/>和<s:element ref="s:schema" /><s:any />其實是等價的。<s:element ref="s:schema"/>其實就是說這裡可以用s:schema規定的任意一種元素類型來替代,<s:any />正是起到了這個作用。 

<s:any minOccurs="2"maxOccurs="2"/>只不過是把兩個<s:any />寫成了一句罷了。

·        2011-06-13 11:17

評論

5樓 jiabo121 2012-10-19  

對於:http://www.webxml.com.cn/zh_cn/web_services.aspx網站提供的web服務是用.net產生的wsdl 如果使用Java調用, (如天氣預報服務) 

解決方式: 

http://www.webxml.com.cn/WebServices/WeatherWebService?wsdl 另存新檔 WeatherWebService.wsdl於wsdl2java相同目錄下;開啟 WeatherWebService.wsdl,將出現 <s:elementref="s:schema" />的地方全部刪除;然後再\bin>wsdl2javaWeatherWebService.wsdl 即可

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.