最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot調(diào)用WebService接口的兩種方式詳解

 更新時(shí)間:2026年03月17日 09:13:39   作者:杰西筆記  
在企業(yè)級(jí)系統(tǒng)開發(fā)中,Web Service是一種常見的跨平臺(tái)通信方式,尤其是在與舊系統(tǒng)對(duì)接時(shí),我們經(jīng)常需要通過SOAP協(xié)議調(diào)用遠(yuǎn)程 WebService接口,本文將詳細(xì)介紹如何在SpringBoot項(xiàng)目中使用Apache CXF實(shí)現(xiàn)WebService的動(dòng)態(tài)調(diào)用和靜態(tài)調(diào)用,需要的朋友可以參考下

前言

在企業(yè)級(jí)系統(tǒng)開發(fā)中,Web Service 是一種常見的跨平臺(tái)通信方式。尤其是在與舊系統(tǒng)對(duì)接時(shí),我們經(jīng)常需要通過 SOAP 協(xié)議調(diào)用遠(yuǎn)程 WebService 接口。

本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中使用 Apache CXF 實(shí)現(xiàn) WebService 的 動(dòng)態(tài)調(diào)用靜態(tài)調(diào)用,并附上完整的示例代碼和操作步驟。

? 支持返回 String[]、byte[] 等復(fù)雜類型
? 提供 WSDL 文件處理流程
? 包含常見問題解決方案

0、前提準(zhǔn)備,添加依賴(Spring Boot + CXF)

這個(gè)maven依賴是動(dòng)態(tài)調(diào)用方法和靜態(tài)調(diào)用方法都需要使用的。添加后更新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 可以自動(dòng)配置 CXF,無需額外 XML 配置。

一、 方法一:動(dòng)態(tài)調(diào)用 WebService(推薦用于調(diào)試)

動(dòng)態(tài)調(diào)用不依賴生成的 Java 類,直接通過 URL 和方法名調(diào)用,靈活性高,適合快速測(cè)試。

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 可以自動(dòng)配置 CXF,無需額外 XML 配置。

2、調(diào)用示例代碼

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 {
            // 創(chuàng)建動(dòng)態(tài)客戶端
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            Client client = dcf.createClient("http://127.0.0.1/Service.asmx?wsdl");

            // 調(diào)用方法,返回 Object[]
            Object[] objects = client.invoke("fuc1", flag, mac, psw);

            // 如果返回的是數(shù)組,轉(zhuǎn)換為 String[]
            if (objects != null && objects.length > 0) {
                return (String[]) objects[0]; // 注意:返回值可能在 objects[0]
            }

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

這里我調(diào)用的時(shí)候,在創(chuàng)建客戶端對(duì)象的時(shí)候報(bào)錯(cuò)了,僅供參考。

3、注意事項(xiàng)

  • client.invoke() 返回的是 Object[],第一個(gè)元素是實(shí)際返回值。
  • 動(dòng)態(tài)調(diào)用不支持復(fù)雜的對(duì)象類型(如自定義類),僅適用于基本類型或數(shù)組。
  • 不推薦用于生產(chǎn)環(huán)境,但非常適合快速驗(yàn)證接口是否可用。

二、方法二:靜態(tài)調(diào)用 WebService(推薦用于生產(chǎn))

靜態(tài)調(diào)用通過 WSDL 文件生成 Java 類,然后像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù),類型安全、易維護(hù)。

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 可以自動(dòng)配置 CXF,無需額外 XML 配置。

2、獲取 WSDL 文件

在瀏覽器中訪問:

http://127.0.0.1/Service.asmx?wsdl

可以看到如下內(nèi)容,說明URL有效。

頁(yè)面顯示 WSDL 內(nèi)容 → 右鍵另存為 → 保存為 service.wsdl

注意:必須以 .wsdl 結(jié)尾

3、使用wsimport生成 Java 類

1. 檢查wsimport是否存在

打開命令行,輸入:

wsimport -version

如果提示找不到命令,請(qǐng)安裝 JDK 并確保 JAVA_HOME 配置正確。

2. 進(jìn)入存放service.wsdl的目錄,執(zhí)行:

wsimport -keep -d . -p com.example.wsclient service.wsdl

注意這里如果提示wsdl文件中有錯(cuò)誤,那么就打開這個(gè)文件修改不對(duì)的地方,重新生成即可。

例如我有個(gè)報(bào)錯(cuò):

我是將284行這個(gè)地方,報(bào)錯(cuò)的節(jié)點(diǎn)修改了一下,重新保存生成就可以了。

報(bào)錯(cuò)的節(jié)點(diǎn):

<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>

當(dāng)時(shí)是這句報(bào)錯(cuò)了:

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

修改后的節(jié)點(diǎn):

      <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>

參數(shù)說明:

參數(shù)說明
-keep保留生成的源文件
-d .輸出目錄為當(dāng)前目錄
-p com.example.wsclient指定包名(替換為你自己的包)

成功后會(huì)生成多個(gè) Java 類,包括:

  • Service.java(服務(wù)類)
  • ServiceSoap.java(端口接口)
  • ArrayOfString.java(數(shù)組包裝類)

4、將生成的類導(dǎo)入項(xiàng)目

將所有生成的 .java 文件復(fù)制到你的項(xiàng)目中指定包下,例如:

src/main/java/com/example/webservice/

這里注意,只需要.java類型的文件,.class類型的文件可以刪除

  1. 手動(dòng)修改所有類的第一行包名,確保一致(可使用 Ctrl+Shift+R 全局替換)。

5、示例代碼:靜態(tài)調(diào)用

import com.AllProcess.process.webservice.Service; // 通訊類
import com.AllProcess.process.webservice.ServiceSoap; // 調(diào)用接口
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. 創(chuàng)建 URL 對(duì)象(遠(yuǎn)程或本地)
            URL wsdlURL = new URL(WEBSERVICE_WSDL_URL);

            // 2. 創(chuàng)建服務(wù)實(shí)例
            Service service = new Service(wsdlURL, new QName("http://www.xxx/", "Service"));

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

            // 4. 調(diào)用方法
            ArrayOfString resultGetData = port.fuc1(flag, mac, psw);

            // 5. 轉(zhuǎn)為 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;
        }
    }
}

最后我在用靜態(tài)調(diào)用方法后,接收到webservice服務(wù)寫的數(shù)據(jù)啦~~!

親測(cè)有效。可以讀取到webservice服務(wù)中的數(shù)據(jù)!

三、動(dòng)態(tài)調(diào)用和靜態(tài)調(diào)用哪個(gè)更好?

維度動(dòng)態(tài)調(diào)用靜態(tài)調(diào)用
開發(fā)效率慢(需生成類)
類型安全弱(運(yùn)行時(shí)異常)強(qiáng)(編譯期檢查)
易維護(hù)性
生產(chǎn)建議? 不推薦? 推薦

總結(jié)

方法優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景
動(dòng)態(tài)調(diào)用靈活、無需生成類類型不安全、不支持復(fù)雜對(duì)象快速測(cè)試、臨時(shí)調(diào)用
靜態(tài)調(diào)用類型安全、易維護(hù)需要生成類、流程繁瑣生產(chǎn)環(huán)境、長(zhǎng)期使用

以上就是SpringBoot調(diào)用WebService接口的兩種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot調(diào)用WebService接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java之SpringBoot定時(shí)任務(wù)案例講解

    Java之SpringBoot定時(shí)任務(wù)案例講解

    這篇文章主要介紹了Java之SpringBoot定時(shí)任務(wù)案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot臨時(shí)屬性設(shè)置方法

    SpringBoot臨時(shí)屬性設(shè)置方法

    這篇文章主要介紹了SpringBoot臨時(shí)屬性設(shè)置方法,SpringBoot工程可以基于java環(huán)境獨(dú)立進(jìn)行jar文件啟動(dòng)服務(wù),文中給大家提到了命令行啟動(dòng)常見問題以及解決方案,需要的朋友可以參考下
    2022-09-09
  • Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    有多個(gè)線程,如何控制它們執(zhí)行的先后次序呢?下文給大家分享四種方法及java多線程調(diào)度的實(shí)例代碼,需要的朋友參考下吧
    2017-05-05
  • SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼

    SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼

    圖片驗(yàn)證碼在注冊(cè)、登錄、交易、交互等各類場(chǎng)景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot整合MyBatis-Plus的示例代碼

    SpringBoot整合MyBatis-Plus的示例代碼

    這篇文章主要介紹了SpringBoot整合MyBatis-Plus的示例代碼,使用?MyBatis-Plus 可以減少大量的開發(fā)時(shí)間,單表的增刪改查可以不用寫 sql 語句,本文主要介紹整合需要主要事項(xiàng),需要的朋友可以參考下
    2022-03-03
  • MyBatis-Plus注解配置、條件構(gòu)造器與自定義SQL的復(fù)雜操作實(shí)例詳解

    MyBatis-Plus注解配置、條件構(gòu)造器與自定義SQL的復(fù)雜操作實(shí)例詳解

    MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,提供快速開發(fā)單表CRUD操作等功能,通過依賴引入和配置,可以快速創(chuàng)建和使用Mapper接口進(jìn)行數(shù)據(jù)庫(kù)操作,這篇文章通過實(shí)例代碼介紹MyBatis-Plus注解配置、條件構(gòu)造器與自定義SQL的復(fù)雜操作,感興趣的朋友一起看看吧
    2026-02-02
  • Spring深入探索AOP切面編程

    Spring深入探索AOP切面編程

    Spring是一個(gè)廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個(gè)標(biāo)準(zhǔn)易用的aop框架,依托Spring的IOC容器,提供了極強(qiáng)的AOP擴(kuò)展增強(qiáng)能力,對(duì)項(xiàng)目開發(fā)提供了極大地便利
    2022-07-07
  • Spring Boot2.X中findOne的使用詳解

    Spring Boot2.X中findOne的使用詳解

    這篇文章主要介紹了Spring Boot2.X中findOne的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中的JPA實(shí)體關(guān)系:JPA一對(duì)一,一對(duì)多(多對(duì)一),多對(duì)多

    Java中的JPA實(shí)體關(guān)系:JPA一對(duì)一,一對(duì)多(多對(duì)一),多對(duì)多

    Java Persistence API(JPA)是Java平臺(tái)上的一個(gè)對(duì)象關(guān)系映射(ORM)規(guī)范,用于簡(jiǎn)化數(shù)據(jù)庫(kù)操作,其中實(shí)體關(guān)系的映射是核心內(nèi)容之一,本文將深入淺出地探討JPA中的三種基本實(shí)體關(guān)系類型:一對(duì)一、一對(duì)多、多對(duì)多,揭示常見問題、易錯(cuò)點(diǎn)及其避免策略,希望能幫助大家
    2024-06-06
  • java中常用注解@TableId的詳細(xì)解析

    java中常用注解@TableId的詳細(xì)解析

    @TableId注解是一種常見的Java注解,通常在使用關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行對(duì)象關(guān)系映射(ORM)時(shí)使用,這篇文章主要介紹了java中常用注解@TableId的詳細(xì)解析,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06

最新評(píng)論

赤壁市| 柘城县| 灌云县| 金寨县| 新安县| 岑溪市| 图木舒克市| 林州市| 偃师市| 大余县| 安福县| 孟州市| 韶山市| 当涂县| 临清市| 山西省| 平度市| 庆云县| 家居| 黎平县| 乡城县| 铜山县| 灌南县| 宜兰市| 吉林省| 天等县| 鹤壁市| 华亭县| 冕宁县| 兴宁市| 上思县| 敦煌市| 黄浦区| 大渡口区| 抚顺市| 雷州市| 象山县| 恩平市| 扶风县| 津南区| 通河县|