今天在使用CXF的wsdl2java.bat 根據wsdl文件生成客戶端調用時出現如下錯誤:java
由於也是臨時接觸CXF,因此一時不知是什麼問題,在網上搜了半天,都是說要替換什麼內容之類的,但也沒說爲何,並且基本都是轉載國外某人的一個文章,因此決心瞭解下爲何?oracle
根據錯誤提示彷佛是找不到s:schema,查看了一下.net生成的wsdl文件,在文件頭部有s:schema命名空間的定義:jsp
xmlns:s=http://www.w3.org/2001/XMLSchemaui
但同時也發現CXF生成的wsdl文件也用到了相似的元素,只不過定義的命名空間名稱略有差別:xmlns:xs=http://www.w3.org/2001/XMLSchemathis
所以基本能夠排除找不到s:schema元素的問題緣由確定不是XML自己定義的問題了。spa
緊接着又看了下wsdl的引入是否會存在版本問題,在對比了JAVA和.NET的WSDL文件後,感受版本也應該是一致的。所以wsdl的版本緣由也能夠排除。.net
http://schemas.xmlsoap.org/wsdl/ (java)code
http://schemas.xmlsoap.org/wsdl/soap/ (.net)xml
通過思考,決定從「在一個xml配置文件中ref表示什麼意思「這個思路入手。查了一篇老外的文章後,大體明白了其做,ref至關於一個引用的意思,具體可見以下例子:blog
當明白了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 />寫成了一句罷了。
此外,再附帶記錄另外一個問題。
wsdl2java -p com.test.orderservice OrderService1.wsdl 一個文件時出現下列錯誤:
這個錯誤是因爲有一行相似這樣<wsdl:part name="Body" /> 缺乏 type="s:string" 形成的