今天在使用CXF的wsdl2java.bat 根据wsdl文件生成客户端调用时出现以下错误:
WSDLToJava Error: Thrown by JAXB: undefined element declaration 's:schema' at line 49 column 19 of schema file:/D:/workspace/webservice/weather/wsdl/weather.wsdl
因为也是临时接触CXF,所以一时不知是什么问题,在网上搜了半天,都是说要替换什么内容之类的,但也没说为什么,而且基本都是转载国外某人的一个文章,只知其然不知其所以然就失去了做技术工作的意义了,因为长此这样是不可能提升自己的。所以决心了解下为什么?
根据错误提示似乎是找不到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"/>
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 />写成了一句罢了。
分享到:
相关推荐
使用cxf wsdl2java生成webservice客户端命令
springboot整合CXF发布webservice和客户端调用 项目中每个类都有详细的注释,保证都能看懂,不失为一个学习springboot整合cxf来学习webservice发布调用的好例子
cxf生成webservice客户端
1、配置环境变量:新建CXF_HOME D:\apache-cxf-2.5.2 在PATH中添加 %CXF_HOME%\bin; 2、测试是否成功 运行cmd 输入 wsdl2java 3、生成客户端:wsdl2java -d C:\Users\ASUS\Desktop\生成的代码存放地址 -encoding ...
JAVA 用 Apache CXF 调用 .NET 服务端 WebService 代码 整个JAVA工程的压缩,导入到myeclipse可直接运行,如果只想浏览下,请访问:http://blog.csdn.net/wqmain/article/details/8216331
2.用cxf开发webservice 3.这个服务端和客户端的小demo 在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息...
cxf框架的webservice,可以完美运行,生成了xml字符串并进行传递以及生成了json对象,客户端进行请求并解析数据
WebService开发客户端 cxf方式
cxf 开发webservice客户端 代码经过测试
ibatis+spring+cxf+mysql搭建webservice的客户端,文章地址在http://blog.csdn.net/cenyi2013/article/details/17315755. 服务端源码的下载地址在http://download.csdn.net/detail/cenyi2012/6712729
使用CXF生成动态调用webservice接口的客户端,也比较简单。
cxf3.2.0作为服务端或客户端,发布webservice或者调用webservice所需的最少jar包。
CXF建立webservice服务端和客户端,发送格式为XML,服务端进行XML解析,并将收到请求报文解析入库,数据库为mysql。
cxf实现webservice详细文档 cxf调用.net webservice 技术详解
cXF实现webservice 服务端和客户端
Springboot整合CXF发布Web service和客户端调用(用户和密码验证)打开及用
apache-cxf-2.7.7以及cxf客户端所需要的jar包,命令生成webservice客户端
使用cxf+spring框架开发webservice的客户端与服务端代码,用于连接两个项目
webservice客户端,框架为CXF,生成客户端的方式为自动(myeclipse生成)