今天在使用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客户端命令
JAVA 用 Apache CXF 调用 .NET 服务端 WebService 代码 整个JAVA工程的压缩,导入到myeclipse可直接运行,如果只想浏览下,请访问:http://blog.csdn.net/wqmain/article/details/8216331
SpringBoot整合CXF是将流行的Java Web服务框架CXF与SpringBoot轻量级框架结合,以便更方便地创建和消费Web服务。这个项目提供了一个很好的示例,通过详细注释帮助开发者理解如何在SpringBoot应用中发布和调用Web服务...
在这个“cxf的webservice的客户端代码”主题中,我们将深入探讨如何使用CXF框架来构建一个能够与Web服务交互的客户端。 首先,创建CXF Web服务客户端的核心在于理解服务代理的生成。CXF提供了WSDL2Java工具,可以从...
在标题和描述中提到的“cxf生成webservice客户端”是指利用CXF的工具从WSDL文件自动生成Java客户端代码,以便于调用Web服务。 生成Web服务客户端的步骤如下: 1. **获取WSDL文件**:Web服务通常会公开一个WSDL文件...
在IT行业中,WebService是...通过理解WSDL、生成客户端代码、配置服务地址以及利用CXF的高级特性,可以高效地完成与WebService的交互。在实际项目中,应结合具体需求,灵活运用这些知识,确保服务调用的稳定性和效率。
2.用cxf开发webservice 3.这个服务端和客户端的小demo 在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息...
- **客户端代理**:CXF自动生成客户端代码,方便调用服务。 **2. 创建Web服务端** 在CXF中,服务端的开发通常涉及以下步骤: 1. 定义服务接口:使用Java接口定义服务方法。 2. 实现服务接口:编写具体的业务逻辑...
这个"CXF动态webservice客户端demo"是为了演示如何使用CXF库创建一个动态调用Web服务接口的客户端应用程序。 首先,我们需要了解Web服务的基本概念。Web服务基于SOAP(Simple Object Access Protocol)协议,通过...
Java WebService CXF客户端调用和服务端的实现是企业级应用程序中常见的通信方式,它基于标准的SOAP(Simple Object Access Protocol)协议,提供了一种在分布式环境中交换信息的方法。CXF是一个开源框架,它简化了...
2. 生成客户端代码:CXF提供了一个工具,可以基于WSDL(Web服务描述语言)文件自动生成客户端代理类。运行以下命令: ```bash java -jar cxf-codegen-plugin-3.4.x.jar -wsdl ...
在IT行业中,Spring Boot是一个非常流行的...4. 使用CXF生成客户端代码。 5. 在客户端应用中创建代理对象并调用服务。 通过这种方式,你可以构建安全、可靠的Web服务,并在Spring Boot环境中轻松地进行客户端调用。
总结起来,Java中的Web Service客户端生成涉及的关键点有:理解WSDL规范,选择合适的工具(如Apache CXF或JAX-WS),正确配置并执行代码生成命令,最后在生成的代码基础上调用Web服务。这极大地简化了与Web服务交互...
其次,关于“命令生成Web服务客户端”,CXF提供了一个名为wsdl2java的工具。这个工具能够从WSDL(Web Service Description Language)文件自动生成Java客户端代码,使得开发者可以轻松地调用远程Web服务。使用命令行...
ibatis+spring+cxf+mysql搭建webservice的客户端,文章地址在http://blog.csdn.net/cenyi2013/article/details/17315755. 服务端源码的下载地址在http://download.csdn.net/detail/cenyi2012/6712729
1、配置环境变量:新建CXF_HOME D:\apache-cxf-2.5.2 在PATH中添加 %CXF_HOME%\bin; 2、测试是否成功 运行cmd 输入 wsdl2java 3、生成客户端:wsdl2java -d C:\Users\ASUS\Desktop\生成的代码存放地址 -encoding ...
本教程将深入探讨如何使用CXF来实现WebService服务端和客户端,帮助开发者更好地理解和应用这一强大的工具。 一、CXF概述 CXF是一个全方位的Web服务框架,它集成了多种协议和技术,如SOAP、REST、WS-*规范等,提供...
cxf实现webservice详细文档 cxf调用.net webservice 技术详解
1. **生成客户端代理类**:CXF提供了工具,如wsdl2java,可以从服务的WSDL(Web Service Definition Language)文件生成客户端所需的代理类和数据模型。 2. **实例化客户端代理**:使用生成的代理类,创建客户端...