關於cxf 連.net 的webservice生成客戶端異常( undefined eleme...

今天在使用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

複製代碼
< 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 />寫成了一句罷了。

 

此外,再附帶記錄另外一個問題。

wsdl2java -p com.test.orderservice OrderService1.wsdl 一個文件時出現下列錯誤:

這個錯誤是因爲有一行相似這樣<wsdl:part name="Body" />  缺乏 type="s:string"  形成的

相關文章
相關標籤/搜索