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文件就能够生成

相关文章
相关标签/搜索