原文地址:代碼人生(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 即可