如何根据WSDL文档,用java编写web service客户端接口?
下面是chatGpt给出的答案:
作者使用了Apache CXF, 将WSDL文档转化成了java代码。
参考链接
利用wsdl2java工具生成webservice的客户端代码
作者主要根据上面链接给出的教程进行操作的,大概步骤如下:
- 首先要安装JDK (我的JDK版本是1.8.0_202)
- 下载Apache CXF,官网地址是:http://cxf.apache.org/download.html
当前最新版本是4.0.0,但4.0.0需要JDK11的支持,我的JDK版本是JDK8,所以我选择了3.2.6这个版本:
https://archive.apache.org/dist/cxf/3.2.6/
注意:需要留意cxf的版本与本地JDK版本是否匹配,如果版本不匹配,后面运行时会报错:A JNI error has occurred, please check your installation and try again
- 解压安装包,bin目录下的wsdl2java就是今天的主角:
- 运行wsdl2java,可以设置环境变量后运行,也可以直接在bin目录下打开cmd直接运行,wsdl2java -help可以查看具体用法。将WSDL文档转化成java代码的命令如下:
wsdl2java -encoding utf-8 -d E:\webservice\src file:///E:/web_service/xxxxxx.wsdl
-encoding表示生成的Java文件编码格式为utf8,
-d表示代码生成路径
最后是wsdl文档的URL,可以是本地文档(以file://开头,将wsdl文档用浏览器打开,显示在地址栏的就是本地wsdl文档的URL),也可以是一个远程地址(如http://开头的URL)。
遇到的坑:
在运行wsdl2java报错:
[Fatal Error] xmlmime:1:1: 文件提前结束。
WSDLToJava Error: org.apache.cxf.wsdl11.WSDLRuntimeException: Fail to create wsdl definition file:///E:/xxxx.wsdl: WSDLException (at /wsdl:definitions/wsdl:types/xsd:schema[1]): faultCode=PARSER_ERROR: Problem parsing 'http://www.w3.org/2005/05/xmlmime'.: org.xml.sax.SAXParseException: 文件提前结束。
原来,wsdl文档有一行:
<xsd:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
把schemaLocation中的http改成https:
<xsd:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="https://www.w3.org/2005/05/xmlmime"/>
再运行就OK了。
原因分析:
import元素
import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。
import的格式如下:
<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" schemaLocation="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
必须有namespace属性和schemaLocation属性:
1.namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;
2.schemaLocation属性:必须指向一个实际的WSDL文档,并且该文档不能为空。
http://www.w3.org/2005/05/xmlmime并没有指向一个实际的WSDL文档,而是会重定向到 https://www.w3.org/2005/05/xmlmime:
https://www.w3.org/2005/05/xmlmime则指向了一个实际的WSDL文档:
【完】