【SOAP-WebService系列】使用WSDL生成SOAP-WebService客户端代码,使用IDEA开发SOAP-WebService示例


参考
使用wsimport命令生成webService客户端代码实例
WebService笔记(一)基础概念和IDEA生成WebService
——————
建议先了解SOAP-WebService:【WebServices系列】详解WebServices:SOAP-WebService & REST


一、热身:使用wsimport命令+WSDL生成客户端代码

在JDK的bin文件夹中,有一个wsimport.exe工具,可利用wsdl文件生成相应的Java类文件,将这些代码文件拷贝到项目中,就可以像调用本地代码一样调用SOAP-WebService提供的远程服务 (比如用Java、C#、PHP等开发了SOAP-WebService的服务端,然后生成对应的wsdl描述文件,最后用wsimport生成Java的客户端实现)

通常执行命令如下:

wsimport -keep -d D:\temp\d -s D:\temp\s -p com.map -verbose http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

# -keep:是否生成java源文件
# -d:指定.class文件的输出目录
# -s:指定.java文件的输出目录
# -p:定义生成类的包名,不定义的话有默认包名
# -verbose:在控制台显示输出信息
# -b:指定jaxws/jaxb绑定文件或额外的schemas
# -extension:使用扩展来支持SOAP1.2

我们可以直接执行以下命令 (需要创建d:\temp\dd:\temp\s目录)
wsimport -keep -d D:\temp\d -s D:\temp\s -p com.map -verbose http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

命令中的wsdl地址是从webxml网站中找的
(如要了解此网站,或命令中的链接失效,请访问:【资源】webxml.com.cn —— SOAP-WebServices提供站)

执行命令后会报错,如下
在这里插入图片描述
这是因为jaxb不支持标签中的ref属性

参考:webservice生成客户端时提示解析组件 ‘s:schema’ 时出错原因
在这里插入图片描述
参考:webService根据wsdl生成文件报错[ERROR] undefined element declaration ‘s:schema‘
在这里插入图片描述

解决办法就是将wsdl文件保存到本地,存为wsdl格式。
然后将文件中的

<s:element ref="s:schema" />
<s:any />

替换为

<s:any minOccurs="2" maxOccurs="2"/>

最后重新执行命令即可
在这里插入图片描述
在vscode中打开生成的文件
在这里插入图片描述
乱码问题,使用GBK编码重新加载即可解决
在这里插入图片描述

二、使用IDEA开发SOAP-WebService项目

1. 创建SOAP-WebService工程

新建一个WebService项目,默认点击Next即可
在这里插入图片描述

2. 使用WSDL生成客户端代码,并调用服务

使用WSDL生成客户端代码,操作如下
在这里插入图片描述
在这里插入图片描述
点击OK,我这里报了个错 Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseException;
在这里插入图片描述
百度得知这是jaxb-xjc出现在java8版本中的一个bug。
解决方法是:在jdk/jre/lib文件夹下新建一个jaxp.properties文件,内容为javax.xml.accessExternalSchema = all

在这里插入图片描述
参考答案在这里插入图片描述

然后重新生成即可
生成时,通过IDE下方的任务显示。看得出这也是IDE通过wsimport命令生成的
在这里插入图片描述
以下是生成的代码。生成的Java文件和class文件都在一个目录下,使用命令可以生成到不同目录。(乱码问题和依然是使用GBK编码重新加载解决)
在这里插入图片描述
接下来添加调用服务的代码

package example;

import testservice.ArrayOfString;
import testservice.WeatherWS;
import testservice.WeatherWSSoap;

import java.util.List;

/**
 * 天气服务
 * @author wushu
 * @create 2021-08-10 0:00
 */
public class WeatherWsClient {

    public static void main(String[] args) {
        //创建一个WeatherWS工厂
        WeatherWS factory = new WeatherWS();
        //根据工厂创建一个WeatherWSSoap对象
        WeatherWSSoap weatherWSSoap = factory.getWeatherWSSoap();
        //调用WebService提供的getWeather方法获取南宁市的天气预报情况
        ArrayOfString weatherInfo = weatherWSSoap.getWeather("钓鱼岛", null);
        List<String> lstWeatherInfo = weatherInfo.getString();
        //遍历天气预报信息
        for (String string : lstWeatherInfo) {
            System.out.println(string);
            System.out.println("------------------------");
        }
        //获得中国省份、直辖市、地区和与之对应的ID
        ArrayOfString s = weatherWSSoap.getRegionProvince();
        List<String> list = s.getString();
        for (String string : list) {
            System.out.println(string);
            System.out.println("------------------------");
        }
    }
}

成功运行
在这里插入图片描述

3. 创建和发布服务

创建项目的时候,IDE为我们生成了默认的示例代码,如下
在这里插入图片描述

【附】SOAP-WebService常用注解

@WebService(						//标识该类是一个webService服务
   serviceName="name" ,		//表示产生的服务的名称
   targetNamespace="http://service.ws.cn")	// WSDL 命名空间名称
 
@WebMethod(
   operationName="hello"  ,	// 表示方法名称
   exclude=true)			// 将指定的public方法排除,用户不能访问

@WebParam(name="name")		// 单个参数至WSDL部件或XML元素的映射,name为名称

@WebResult(name="return")	// 返回值至WSDL部件或XML元素的映射,name为名称

添加一行 启动成功 的提示打印,然后直接启动
在这里插入图片描述
访问这个地址,看得出来,该有的就都有了。
在这里插入图片描述
wsdl。其他人可以使用这个来生成调用该服务的代码,就像我们刚才使用别人的wsdl生成代码并调用一样
在这里插入图片描述
end

三、【附】使用wsdl2java.exe+WSDL生成客户端代码 --更推荐

除了使用java原生的wsimport生成代码外,还可以使用CXF提供的wsdl2java.exe来生成(本文写完才知道这个)

并且更推荐使用wsdl2java.exe来生成
因为wsimport是根据JDK1.6.0_21及以上版本生成代码的,它只能解析服务器端的SOAP协议为1.1,不能解析SOAP1.2的协议。如果解析SOAP1.2 将会解析不完全
wsdl2java是根据jdk1.7生成的本地代码,支持SOAP1.1和SOAP1.2
(意思可能是wsimport是基于jdk1.6开发的,那个时候没出soap1.2,并且之后也没有去兼容soap1.2)

时间有限,这里就不做实践了


😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] '300567032’
点击下方图标一键加入!
游戏-Web-开发技术栈 ☄


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成 WSDL 文件是使用 JAX-WS API 的一个常见任务。以下是使用 JAX-WS API 生成 WSDL 文件的步骤: 1. 创建一个 Java 类,该类将充当 Web 服务的实现。这个实现类应该有一个无参构造函数,并且应该被注释为 @WebService。 2. 使用 JAX-WS API 的 Endpoint 类来发布 Web 服务。在发布 Web 服务时,您需要指定 Web 服务的地址和实现类。例如,以下代码发布了 Web 服务,该服务使用 MyServiceImpl 类作为其实现,并在 localhost 的口 8080 上运行: ```java MyServiceImpl myService = new MyServiceImpl(); String address = "http://localhost:8080/myservice"; Endpoint.publish(address, myService); ``` 3. 在 Web 服务发布后,您可以使用 JAX-WS API 的 WSDLGenerator 类生成 WSDL 文件。以下是使用 WSDLGenerator 生成 WSDL 文件的代码: ```java WSDLFactory factory = WSDLFactory.newInstance(); WSDLGenerator wsdlGenerator = factory.newWSDLGenerator(); StringWriter writer = new StringWriter(); wsdlGenerator.generateWSDL(MyServiceImpl.class, new StreamResult(writer)); String wsdl = writer.toString(); System.out.println(wsdl); ``` 在这段代码中,我们首先创建了一个 WSDLFactory 实例,然后使用该工厂创建一个 WSDLGenerator 实例。接下来,我们创建一个 StringWriter 对象,以便将生成WSDL 文件写入字符串。最后,我们调用 WSDLGenerator 的 generateWSDL() 方法来生成 WSDL 文件,并将其写入 StringWriter 中。 以上就是使用 JAX-WS API 生成 WSDL 文件的详细步骤和代码。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值