SpringBoot調(diào)用WebService接口的兩種方式詳解
前言
在企業(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類型的文件可以刪除

- 手動(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ù)案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
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)證碼的示例代碼
圖片驗(yàn)證碼在注冊(cè)、登錄、交易、交互等各類場(chǎng)景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
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
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

