原文地址:代碼人生(http://wensiqun.iteye.com/blog/1083340)html
今天在使用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 java
由於也是臨時接觸CXF,因此一時不知是什麼問題,在網上搜了半天,都是說要替換什麼內容之類的,但也沒說爲何,並且基本都是轉載國外某人的一個文章,只知其然不知其因此然就失去了作技術工做的意義了,由於長此這樣是不可能提高本身的。因此決心瞭解下爲何? web
根據錯誤提示彷佛是找不到s:schema,查看了一下.net生成的wsdl文件,在文件頭部有s:schema命名空間的定義: app
xmlns:s=http://www.w3.org/2001/XMLSchema 網站
但同時也發現CXF生成的wsdl文件也用到了相似的元素,只不過定義的命名空間名稱略有差別:xmlns:xs=http://www.w3.org/2001/XMLSchema ui
所以基本能夠排除找不到s:schema元素的問題緣由確定不是XML自己定義的問題了。this
緊接着又看了下wsdl的引入是否會存在版本問題,在對比了JAVA和.NET的WSDL文件後,感受版本也應該是一致的。所以wsdl的版本緣由也能夠排除。spa
http://schemas.xmlsoap.org/wsdl/ (java) .net
http://schemas.xmlsoap.org/wsdl/soap/(.net) xml
通過思考,決定從「在一個xml配置文件中ref表示什麼意思「這個思路入手。查了一篇老外的文章後,大體明白了其做,ref至關於一個引用的意思,具體可見以下例子:
[html] view plain copy
equivalent to this: [html] view plain copy
當明白了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 便可