准备工作
基础环境:
<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调用天气接口遇见的问题
如有侵权,联系删除
希望这是你参考的最后一篇文章!