webservice生成客戶端時提示解析組件 's:schema' 時出錯原因

錯誤提示:

[WARNING] src-resolve.4.2: 解析組件 ‘s:schema’ 時出錯。在該組件中檢測到 ‘s:schema’ 。。。

在網上搜了半天,都是說要替換什麼內容之類的,但也沒說爲什麼,而且基本都是轉載國外某人的一個文章,然而並沒有說明原因。下面就一步步來查找原因:

根據錯誤提示似乎是找不到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"/>
<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”似乎爲我的想提供了佐證,在國外的一些文章上對待這樣的錯誤有如下的解決辦法:用替代 ,我試了下果然可以,因此我基本上可以個人武斷地認爲這個wsdl2java的生成錯誤應該是和JAXB不支持xml的ref有關。因爲

和其實是等價的。其實就是說這裏可以用s:schema規定的任意一種元素類型來替代,正是起到了這個作用。
只不過是把兩個寫成了一句罷了。

發佈了31 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章