使用Apache CXF 将WSDL文档转化成java代码

如何根据WSDL文档,用java编写web service客户端接口?

下面是chatGpt给出的答案:

使用Apache CXF 将WSDL文档转化成java代码_第1张图片
作者使用了Apache CXF, 将WSDL文档转化成了java代码。

参考链接

利用wsdl2java工具生成webservice的客户端代码

作者主要根据上面链接给出的教程进行操作的,大概步骤如下:

  1. 首先要安装JDK (我的JDK版本是1.8.0_202)
  2. 下载Apache CXF,官网地址是:http://cxf.apache.org/download.html
    使用Apache CXF 将WSDL文档转化成java代码_第2张图片
    当前最新版本是4.0.0,但4.0.0需要JDK11的支持,我的JDK版本是JDK8,所以我选择了3.2.6这个版本:
    https://archive.apache.org/dist/cxf/3.2.6/
    使用Apache CXF 将WSDL文档转化成java代码_第3张图片
    注意:需要留意cxf的版本与本地JDK版本是否匹配,如果版本不匹配,后面运行时会报错:A JNI error has occurred, please check your installation and try again
    使用Apache CXF 将WSDL文档转化成java代码_第4张图片
  3. 解压安装包,bin目录下的wsdl2java就是今天的主角:
    使用Apache CXF 将WSDL文档转化成java代码_第5张图片
  4. 运行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
使用Apache CXF 将WSDL文档转化成java代码_第6张图片
https://www.w3.org/2005/05/xmlmime则指向了一个实际的WSDL文档:
使用Apache CXF 将WSDL文档转化成java代码_第7张图片
【完】

你可能感兴趣的:(web,service,后端开发,java)