【Spring Boot】Spring Boot调用 WebService 接口的两种方式:动态调用 vs 静态调用 亲测有效

文章目录


前言

在企业级系统开发中,Web Service 是一种常见的跨平台通信方式。尤其是在与旧系统对接时,我们经常需要通过 SOAP 协议调用远程 WebService 接口。

本文将详细介绍如何在 Spring Boot 项目中使用 Apache CXF 实现 WebService 的 动态调用静态调用,并附上完整的示例代码和操作步骤。

✅ 支持返回 String[]byte[] 等复杂类型
✅ 提供 WSDL 文件处理流程
✅ 包含常见问题解决方案

0、前提准备,添加依赖(Spring Boot + CXF)

这个maven依赖是动态调用方法和静态调用方法都需要使用的。添加后更新maven。

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.4.10</version></dependency>
💡 使用 cxf-spring-boot-starter-jaxws 可以自动配置 CXF,无需额外 XML 配置。

一、 方法一:动态调用 WebService(推荐用于调试)

动态调用不依赖生成的 Java 类,直接通过 URL 和方法名调用,灵活性高,适合快速测试。

1. 添加依赖(Spring Boot + CXF)

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.4.10</version></dependency>
💡 使用 cxf-spring-boot-starter-jaxws 可以自动配置 CXF,无需额外 XML 配置。

2、调用示例代码

importorg.apache.cxf.endpoint.Client;importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;publicclassWebServiceDynamicClient{publicString[]callFuc1(String flag,String mac,String psw){try{// 创建动态客户端JaxWsDynamicClientFactory dcf =JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient("http://127.0.0.1/Service.asmx?wsdl");// 调用方法,返回 Object[]Object[] objects = client.invoke("fuc1", flag, mac, psw);// 如果返回的是数组,转换为 String[]if(objects !=null&& objects.length >0){return(String[]) objects[0];// 注意:返回值可能在 objects[0]}}catch(Exception e){ e.printStackTrace();}returnnull;}

这里我调用的时候,在创建客户端对象的时候报错了,仅供参考。

3、注意事项

  • client.invoke() 返回的是 Object[],第一个元素是实际返回值。
  • 动态调用不支持复杂的对象类型(如自定义类),仅适用于基本类型或数组。
  • 不推荐用于生产环境,但非常适合快速验证接口是否可用。

二、方法二:静态调用 WebService(推荐用于生产)

静态调用通过 WSDL 文件生成 Java 类,然后像调用本地方法一样调用远程服务,类型安全、易维护。

1. 添加依赖(Spring Boot + CXF)

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.4.10</version></dependency>
💡 使用 cxf-spring-boot-starter-jaxws 可以自动配置 CXF,无需额外 XML 配置。

2、获取 WSDL 文件

在浏览器中访问:

http://127.0.0.1/Service.asmx?wsdl 

可以看到如下内容,说明URL有效。

在这里插入图片描述

页面显示 WSDL 内容 → 右键另存为 → 保存为 service.wsdl

👉 注意:必须以 .wsdl 结尾
在这里插入图片描述

3、使用 wsimport 生成 Java 类

1. 检查 wsimport 是否存在

打开命令行,输入:

wsimport -version 
在这里插入图片描述

如果提示找不到命令,请安装 JDK 并确保 JAVA_HOME 配置正确。

2. 进入存放 service.wsdl 的目录,执行:
wsimport -keep -d . -p com.example.wsclient service.wsdl 
在这里插入图片描述

注意这里如果提示wsdl文件中有错误,那么就打开这个文件修改不对的地方,重新生成即可。

例如我有个报错:

在这里插入图片描述

我是将284行这个地方,报错的节点修改了一下,重新保存生成就可以了。

报错的节点:

<s:element name="GetDataResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetDataResult"> <s:complexType> <s:sequence> <s:element ref="s:schema"/> <s:any/> </s:sequence> </s:complexType> </s:element> </s:sequence> </s:complexType> 

当时是这句报错了:

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

修改后的节点:

 <s:element name="GetDataResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetDataResponse"> <s:complexType> <s:sequence> <!-- 替换非法引用为任意 XML --> <s:any minOccurs="0" maxOccurs="unbounded" processContents="lax" /> </s:sequence> </s:complexType> </s:element> </s:sequence> </s:complexType> </s:element> 

参数说明:

参数说明
-keep保留生成的源文件
-d .输出目录为当前目录
-p com.example.wsclient指定包名(替换为你自己的包)
✅ 成功后会生成多个 Java 类,包括:Service.java(服务类)ServiceSoap.java(端口接口)ArrayOfString.java(数组包装类)
在这里插入图片描述

4、将生成的类导入项目

将所有生成的 .java 文件复制到你的项目中指定包下,例如:

src/main/java/com/example/webservice/ 
这里注意,只需要.java类型的文件,.class类型的文件可以删除
在这里插入图片描述
  1. 手动修改所有类的第一行包名,确保一致(可使用 Ctrl+Shift+R 全局替换)。
在这里插入图片描述

5、示例代码:静态调用

importcom.AllProcess.process.webservice.Service;// 通讯类importcom.AllProcess.process.webservice.ServiceSoap;// 调用接口importcom.AllProcess.process.webservice.ArrayOfString;importorg.springframework.stereotype.Component;importjavax.xml.namespace.QName;importjava.net.URL;@ComponentpublicclassWebServiceStaticClient{privatestaticfinalString WEBSERVICE_WSDL_URL ="http://127.0.0.1/Service.asmx?wsdl";privatestaticfinalString LOCAL_WSDL_PATH ="file:/D:/文件夹/service.wsdl";publicString[]callFuc1(String flag,String mac,String psw){try{// 1. 创建 URL 对象(远程或本地)URL wsdlURL =newURL(WEBSERVICE_WSDL_URL);// 2. 创建服务实例Service service =newService(wsdlURL,newQName("http://www.xxx/","Service"));// 3. 获取端口代理ServiceSoap port = service.getServiceSoap();// 4. 调用方法ArrayOfString resultGetData = port.fuc1(flag, mac, psw);// 5. 转为 String[]String[] result = resultGetData.getString().toArray(newString[0]);System.out.println("Response: "+Arrays.toString(result));return result;}catch(Exception e){ e.printStackTrace();returnnull;}}}

最后我在用静态调用方法后,接收到webservice服务写的数据啦~~!

亲测有效。可以读取到webservice服务中的数据!

三、动态调用和静态调用哪个更好?

维度动态调用静态调用
开发效率慢(需生成类)
类型安全弱(运行时异常)强(编译期检查)
易维护性
生产建议❌ 不推荐✅ 推荐

总结

方法优点缺点适用场景
动态调用灵活、无需生成类类型不安全、不支持复杂对象快速测试、临时调用
静态调用类型安全、易维护需要生成类、流程繁琐生产环境、长期使用

📚 参考资料


🎯 建议:开发阶段用 动态调用 快速验证接口上线前用 静态调用 替换,保证稳定性

📌 欢迎点赞、收藏、转发!

Read more

使用VS Code插件搭建AI开发环境完全指南

使用VS Code插件搭建AI开发环境完全指南

1. AI编程工具概述 目前主流的AI编程工具主要分为三类:集成IDE、插件模式和独立CLI。其中,插件模式以其轻量级和高兼容性成为许多开发者的首选。通过在VS Code中安装相应插件,开发者可以在不离开熟悉的编辑器环境的情况下,享受到AI辅助编程的便利。 插件模式的优势在于: 无需切换编辑器,保持开发环境一致性 可根据需求灵活选择不同AI模型 资源占用小,启动速度快 支持与本地开发环境深度集成 2. VS Code AI插件选择 目前市场上有多种VS Code AI插件可供选择,各有特色。以下是几款主流插件的对比分析: 插件名称 开发公司 主要特点 中文支持 推荐指数 RooCode 第三方 支持多种模型,架构/编码/问答模式 优秀 ★★★★★ TRAE 字节跳动 原名MarsCODE,支持国产模型 优秀 ★★★★☆ 通义灵码 阿里巴巴 基于千问模型,集成阿里生态 优秀 ★★★★☆ CodeBuddy

Akagi雀魂助手完整使用指南:5分钟快速上手AI麻将分析

Akagi是一款专为雀魂(Mahjong Soul)游戏设计的智能助手客户端,能够实时捕获游戏数据流,通过AI分析提供专业的麻将决策建议。这款开源工具不仅能帮助玩家提升麻将技能,还能深入理解对局表现,是麻将爱好者必备的学习分析工具。 【免费下载链接】AkagiA helper client for Majsoul 项目地址: https://gitcode.com/gh_mirrors/ak/Akagi 🎯 项目核心功能解析 Akagi麻雀助手通过先进的技术架构实现了多维度麻将分析功能。该项目位于 https://gitcode.com/gh_mirrors/ak/Akagi,核心功能包括: 实时数据捕获:通过中间人技术实时获取游戏通信数据,确保分析的准确性和及时性。 智能AI分析:基于先进的Mortal模型提供专业的打牌建议,帮助玩家做出更优决策。 可视化界面:通过清晰的用户界面展示分析结果,让复杂的数据变得直观易懂。 🚀 5分钟快速安装指南 Windows系统一键安装 Windows用户可以通过简单的PowerShell脚本完成快速安装: 1. 下载安

Cursor Rules 实战指南—让AI按你的规矩写代码

Cursor Rules 实战指南 让AI按你的规矩写代码 你有没有遇到过这种情况? 让AI改个bug,它顺手把整个架构重构了;让它加功能,非要引入五六个陌生的库;让它写注释,结果全是英文... 🎯 什么是 Cursor Rules? Cursor Rules,本质上就是给AI写的"员工手册"。在这个文件里,你可以定义: 类别示例代码风格用Tab还是空格、命名规范技术栈偏好必须用React、禁止用jQuery工作习惯先读代码再动手、不过度设计语言要求回复必须用中文 AI每次工作前都会先读这份手册,然后严格执行。相当于你招了个实习生,但他100%服从命令! ▲ Cursor Rules 目录结构 ⚡ 实战配置:三步搞定 第一步:在项目根目录创建 .cursor/rules 文件夹 第二步:新建 *.mdc 文件,写入你的规则 第三步:Cursor 自动识别,立刻生效

宏智树AI——ChatGPT学术版驱动,一站式论文写作智能解决方案

宏智树AI——ChatGPT学术版驱动,一站式论文写作智能解决方案

在学术创作日益精细化、规范化的今天,每一位科研学子、研究者都曾面临论文写作的多重困境:大纲难立、文献繁杂、数据难析、格式繁琐,耗费大量时间在机械性工作上,难以聚焦核心研究价值。宏智树AI应运而生,作为一款专为论文写作量身打造的学术写作辅助平台,依托ChatGPT学术版模型驱动,搭载先进AI5.0技术架构,构建起覆盖“大纲生成到定稿答辩”的全流程学术智能解决方案,重新定义学术创作效率与质量边界,让每一份学术成果都能高效落地、彰显专业。 宏智树AI的核心竞争力,源于其深耕学术场景的技术沉淀与功能布局。不同于通用型AI写作工具,平台以ChatGPT学术版为核心驱动,结合AI5.0技术架构的迭代优势,针对学术写作的逻辑特性、规范要求进行千万级学术语料训练,精准适配各学科论文写作范式,实现“智能赋能不越界,专业辅助不缺位”,既保留研究者的核心思考,又高效解决写作中的各类痛点,让学术创作更轻松、更合规、更具深度。 硬核技术底座:ChatGPT学术版+AI5.0,解锁学术智能新高度 技术是学术辅助的核心支撑,宏智树AI以双重技术优势,筑牢学术创作的智能根基。依托ChatGPT学术版模型的强大