SpringBoot调用WebService接口的两种方式详解

 更新时间:2026年03月17日 09:13:39   作者:杰西笔记  
在企业级系统开发中,Web Service是一种常见的跨平台通信方式,尤其是在与旧系统对接时,我们经常需要通过SOAP协议调用远程 WebService接口,本文将详细介绍如何在SpringBoot项目中使用Apache CXF实现WebService的动态调用和静态调用,需要的朋友可以参考下

前言

在企业级系统开发中,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、调用示例代码

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class WebServiceDynamicClient {

    public String[] 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();
        }
        return null;
    }

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

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、示例代码:静态调用

import com.AllProcess.process.webservice.Service; // 通讯类
import com.AllProcess.process.webservice.ServiceSoap; // 调用接口
import com.AllProcess.process.webservice.ArrayOfString;

import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;
import java.net.URL;

@Component
public class WebServiceStaticClient {

    private static final String WEBSERVICE_WSDL_URL = "http://127.0.0.1/Service.asmx?wsdl";
    private static final String LOCAL_WSDL_PATH = "file:/D:/文件夹/service.wsdl";

    public String[] callFuc1(String flag, String mac, String psw) {
        try {
            // 1. 创建 URL 对象(远程或本地)
            URL wsdlURL = new URL(WEBSERVICE_WSDL_URL);

            // 2. 创建服务实例
            Service service = new Service(wsdlURL, new QName("http://www.xxx/", "Service"));

            // 3. 获取端口代理
            ServiceSoap port = service.getServiceSoap();

            // 4. 调用方法
            ArrayOfString resultGetData = port.fuc1(flag, mac, psw);

            // 5. 转为 String[]
            String[] result = resultGetData.getString().toArray(new String[0]);

            System.out.println("Response: " + Arrays.toString(result));
            return result;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

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

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

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

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

总结

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

以上就是SpringBoot调用WebService接口的两种方式详解的详细内容,更多关于SpringBoot调用WebService接口的资料请关注脚本之家其它相关文章!

相关文章

  • Java之SpringBoot定时任务案例讲解

    Java之SpringBoot定时任务案例讲解

    这篇文章主要介绍了Java之SpringBoot定时任务案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot临时属性设置方法

    SpringBoot临时属性设置方法

    这篇文章主要介绍了SpringBoot临时属性设置方法,SpringBoot工程可以基于java环境独立进行jar文件启动服务,文中给大家提到了命令行启动常见问题以及解决方案,需要的朋友可以参考下
    2022-09-09
  • Java多线程的调度_动力节点Java学院整理

    Java多线程的调度_动力节点Java学院整理

    有多个线程,如何控制它们执行的先后次序呢?下文给大家分享四种方法及java多线程调度的实例代码,需要的朋友参考下吧
    2017-05-05
  • SpringBoot+Hutool实现图片验证码的示例代码

    SpringBoot+Hutool实现图片验证码的示例代码

    图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,本文主要介绍了SpringBoot+Hutool实现图片验证码的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot整合MyBatis-Plus的示例代码

    SpringBoot整合MyBatis-Plus的示例代码

    这篇文章主要介绍了SpringBoot整合MyBatis-Plus的示例代码,使用 MyBatis-Plus 可以减少大量的开发时间,单表的增删改查可以不用写 sql 语句,本文主要介绍整合需要主要事项,需要的朋友可以参考下
    2022-03-03
  • MyBatis-Plus注解配置、条件构造器与自定义SQL的复杂操作实例详解

    MyBatis-Plus注解配置、条件构造器与自定义SQL的复杂操作实例详解

    MyBatis-Plus是一个MyBatis的增强工具,提供快速开发单表CRUD操作等功能,通过依赖引入和配置,可以快速创建和使用Mapper接口进行数据库操作,这篇文章通过实例代码介绍MyBatis-Plus注解配置、条件构造器与自定义SQL的复杂操作,感兴趣的朋友一起看看吧
    2026-02-02
  • Spring深入探索AOP切面编程

    Spring深入探索AOP切面编程

    Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利
    2022-07-07
  • Spring Boot2.X中findOne的使用详解

    Spring Boot2.X中findOne的使用详解

    这篇文章主要介绍了Spring Boot2.X中findOne的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中的JPA实体关系:JPA一对一,一对多(多对一),多对多

    Java中的JPA实体关系:JPA一对一,一对多(多对一),多对多

    Java Persistence API(JPA)是Java平台上的一个对象关系映射(ORM)规范,用于简化数据库操作,其中实体关系的映射是核心内容之一,本文将深入浅出地探讨JPA中的三种基本实体关系类型:一对一、一对多、多对多,揭示常见问题、易错点及其避免策略,希望能帮助大家
    2024-06-06
  • java中常用注解@TableId的详细解析

    java中常用注解@TableId的详细解析

    @TableId注解是一种常见的Java注解,通常在使用关系型数据库进行对象关系映射(ORM)时使用,这篇文章主要介绍了java中常用注解@TableId的详细解析,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06

最新评论