首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java WSDL WebService 客戶端生成與調用全攻略

     編輯:Java 相關知識

前言:從 WSDL 到 Java 代碼的多種途徑

給定 WSDL 文檔或服務地址,生成客戶端調用代碼是 WebService 整合的第一步。本文匯總四種主流生成方式及 Maven 依賴配置。

方式一:JDK 內建 wsimport 命令列工具

基本語法

wsimport -keep -p com.demo.client https://localhost:8080/Demo/services/MyService?wsdl

常用參數詳解

參數作用
-keep保留生成的 .java 源碼(預設僅生成 .class)
-p <pkg>指定生成代碼的包結構
-d <dir>指定 .class 輸出目錄
-s <dir>指定 .java 源碼輸出目錄
-clientjar <jar>直接打包生成客戶端 JAR
-verbose輸出詳細編譯資訊
-extension允許使用 JAX-WS 2.0 擴展功能
-Xnocompile僅生成源碼,不編譯

實戰示例

# 生成源碼到指定目錄,包名為 com.myapp.ws
wsimport -keep -s src/main/java -p com.myapp.ws https://example.com/service?wsdl

# 直接生成可用的客戶端 JAR
wsimport -keep -clientjar myclient.jar -p com.myapp.ws https://example.com/service?wsdl

方式二:Eclipse 圖形化向導

  1. New → Other → Web Services → Web Service Client
  2. 輸入 WSDL 路徑(本地文件或 URL)
  3. 選擇 Runtime(建議 Apache CXF 或 Axis2)
  4. 配置生成選項:包名、輸出目錄等
  5. Finish 自動生成客戶端代碼

優點:可視化、整合 IDE 調試;缺點:難以納入自動化構建流程。

方式三:MyEclipse 專用向導

流程與 Eclipse 類似:New → Other → Web Service → Web Service Client,介面略有差異,核心功能一致。

方式四:Maven 插件自動化生成(推薦 CI/CD)

cxf-codegen-plugin 配置

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>3.5.5</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/service.wsdl</wsdl>
                        <extraargs>
                            <extraarg>-p</extraarg>
                            <extraarg>com.myapp.ws</extraarg>
                            <extraarg>-client</extraarg>
                            <extraarg>-verbose</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

執行 mvn generate-sources 即可自動生成代碼到 target/generated-sources/cxf,IDE 可將其標記為 Sources Root。

WSDL 客戶端運行時依賴(Maven)

無論哪種生成方式,運行時均需以下依賴:

<dependencies>
    <!-- Apache Axis 1.x 相容 -->
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.5</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>javax.xml</groupId>
        <artifactId>jaxrpc</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.soap</groupId>
        <artifactId>saaj-api</artifactId>
        <version>1.3.5</version>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
        <version>1.6.3</version>
    </dependency>

    <!-- 現代替代:Apache CXF (推薦) -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.5.5</version>
    </dependency>
</dependencies>

動態客戶端調用示例(無需預生成代碼)

public class DynamicClient {
    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
        Client client = factory.createClient("https://localhost:8080/service?wsdl");
        
        // 呼叫 sayHello(String name)
        Object[] result = client.invoke("sayHello", "World");
        System.out.println("回應:" + result[0]);
    }
}

常見問題排查

問題原因與解決
生成代碼包含重複類WSDL 引用多個 Schema 定義相同類型,使用 -b 綁定文件自定義包名
javax.xml.ws.WebServiceException: Cannot find portWSDL 中 service/port 名稱與調用不匹配,檢查生成代碼中的 @WebServiceRef
SSLHandshakeExceptionHTTPS 服務需導入憑證至 JVM truststore 或配置 SSLContext
命名空間不匹配客戶端生成代碼的 targetNamespace 與服務端不一致,檢查 @WebService 注解

最佳實踐建議

  1. CI/CD 集成:使用 cxf-codegen-plugin 在構建階段自動生成,源碼不提交倉庫
  2. 版本管理:WSDL 文件放入 src/main/resources/wsdl/ 版本控制
  3. 介面隔離:定義內部 Facade 介面封裝生成的客戶端,業務代碼依賴 Facade 而非生成代碼
  4. 異常處理:統一捕獲 SOAPFaultException、WebServiceException 轉換為業務異常
  5. 超時配置:BindingProviderProperties.CONNECT_TIMEOUT、REQUEST_TIMEOUT

總結

從 WSDL 生成 Java 客戶端的四條路徑:

  • wsimport:輕量、無依賴、適合快速驗證
  • Eclipse/MyEclipse:可視化、適合初學者探索
  • Maven 插件:生產環境首選,自動化、可重複、版本可控
  • 動態客戶端:無需生成代碼,適合動態發現服務場景

配合 CXF 運行時依賴,即可構建穩健的 WebService 消費端。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved