CXF生成webservice客戶端 發生undefined element declaration

CXF生成webservice客戶端 發生undefined element declaration 's:schema' html


今天在使用CXF的wsdl2java 根據wsdl文件生成客戶端調用時出現如下錯誤:java

由於也是臨時接觸CXF,因此一時不知是什麼問題,在網上搜了半天,都是說要替換什麼內容之類的,但也沒說爲何,並且基本都是轉載國外某人的一個文章,因此決心瞭解下爲何?web

根據錯誤提示彷佛是找不到s:schema,查看了一下.net生成的wsdl文件,在文件頭部有s:schema命名空間的定義:oracle

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

但同時也發現CXF生成的wsdl文件也用到了相似的元素,只不過定義的命名空間名稱略有差別:xmlns:xs=http://www.w3.org/2001/XMLSchemaui

所以基本能夠排除找不到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 plaincopy

  1. <element name="foo">   

  2. <complexType>  

  3. <element ref="a:bar"/>  

  4. </complexType>  

  5. </element>  

  6.   

  7. <element name="bar" type="string"/>  

  8.   

  9. equivalent to this:  

  10.   

  11. <element name="foo">   

  12. <complexType>  

  13. <element name="bar" type="string"/>  

  14. </complexType>  

  15. </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 />寫成了一句罷了。

 其實就是吧wsdl文件下載下來,打開下載的wsdl文件,將出現 <s:element ref="s:schema" />的地方所有刪除,再用修改後的wsdl文件就能夠生成

相關文章
相關標籤/搜索