准备工作

基础环境:

<spring-boot.version>2.0.4.RELEASE</spring-boot.version>
<java.version>1.8</java.version>

本文将选取里面的 “中国气象局” 天气查询服务作为调用演示。

Endpoint 地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
WSDL地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

一、引入IDEA

第一步:先选择需要引入的package目录,选择Tools -> WebServices -> Generate Java Code From Wsdl…
在这里插入图片描述
第二步:填入你获得的WSDL URL,Service Platform选择JWSDP 2.2那一条
在这里插入图片描述
第三步:点击OK后,你将获得如下的代码列表在你的package中

通常问题在这一步,此时会报错然后package中生成了一个文件,WeatherWebService.asmx
我们只需要把这个文件改名为我们可以打开的文件类型,列如.xml文件
将文件中所有的<s:element ref=“s:schema” /><s:any /> 替换成 <s:any minOccurs=“2” maxOccurs=“2”/>
注意:是一对标签改为一个标签,有些小伙伴理解错误,把<s:any />替换成了<s:any minOccurs="2" maxOccurs="2"/>,要细心哦
走过这个坑后,就可以继续返回第二步,将WSDL URL选择为你package中的已经改好的WeatherWebService.asmx这个文件,重新OK走起

在这里插入图片描述

对应的class文件可以直接删除,我们自行编译生成
WeatherWebService.asmx这个文件万万不能删除,后面会用到

二、代码修改

打开WeatherWebService.java(webservice主类,通常就是你WSDL地址后面的名字)
在这里插入图片描述

特别提醒:
1)代理类中有些类相互引用时,使用的是绝对地址,如在 WeatherWebServiceSoap 接口中使用了这样的代码, cn.com.webxml.ArrayOfString 来引用 ArrayOfString ,于是要不就是自己新建和它一样的包,然后放置进去,如上所示,要不就是修改源码中原来的包名和自己包名的保持一致,否则报错。
2)因为 wsimport.exe 是转换的本地的 wsdl 文件,而不是在线的 wsdl 文件,所以代码中关联的也是本地的 wsdl 文件,这个文件必须存在,如果这个文件删除了,则项目运行的时候就会找不到而解析失败。所以如果文件移动了位置,则代码中也要相应的修改。
3)建议将 wsdl 文件放在项目中(资源目录下),这样就可以和项目一起移动,否则如果将来项目移动了,而忘了本地的 wsdl 文件,显然运行就报错了。

三、测试

这是我们唯一需要写代码的地方,新建一个测试类TestMain.java

package com.ebei.sharecenter.weather;

import java.util.List;

public class TestMain {
    
    public static void main(String[] args) {
        /**1、创建实现类对象
         * */
        WeatherWebService weatherWebService = new WeatherWebService();
        /** 2、获取服务接口实例
         * 这些代码只能看着源码跟着感觉来写,因为代码完全是人家写的,对方通常也不会提供什么使用文档的
         */
        WeatherWebServiceSoap weatherWebServiceSoap = weatherWebService.getWeatherWebServiceSoap();
        /**
         *3、有了服务接口实例,就可以调用其中的方法了,这里返回值也是对方使用的对象
         */
        ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("无锡");
        /**
         * 4、看着源码即可轻松写出,毕竟都是程序猿,猜也猜出它的目的
         */
        List<String> stringList = arrayOfString.getString();
        int count = 1;
        for (String s : stringList) {
            System.out.println((count++) + ":::" + s);
        }
    }
}

若此时发现报错
No namespace on “html” element. You must send a SOAP message.
在这里插入图片描述
在这里插入图片描述
需要排除我们引入的cxf相关包

<exclusions>
    <exclusion>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
    </exclusion>
    <exclusion>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
    </exclusion>
</exclusions>

总结

此篇文章上半部分参考了外站某个博主的文章JWS(JAVA WEB SERVICE) 调用第三方 WEBSERVICE 服务·天气预报

测试期间发现的坑参考了本站webService调用天气接口遇见的问题

如有侵权,联系删除

希望这是你参考的最后一篇文章!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐