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

Java 使用 XFire 框架調用 WebService 接口完整指南

     編輯:Java 相關知識

XFire 是早期 Java WebService 框架(現已併入 Apache CXF),仍有存量系統在用。本文記錄從環境搭建、服務發布、WSDL 生成到客戶端調用的完整流程,並補充 WSDL 結構深度解析,助力維護老項目或理解 WebService 基礎。

1. 環境準備與依賴

  • 下載 XFire 分發包(建議 all-in-one),將 JAR 放入 WEB-INF/lib。
  • 核心依賴:xfire-core、xfire-java5、xfire-jsr181-api、aegis、wstx 等。

2. 定義服務接口與實現

// 接口(必須,XFire 基於接口生成 WSDL)
public interface IReaderService {
    Reader getReader(String name, String password);
    List getReaders();
}

// 實現類
public class ReaderService implements IReaderService {
    public Reader getReader(String name, String password) {
        return new Reader(name, password);
    }
    public List getReaders() {
        return Arrays.asList(new Reader("shun1","123"), new Reader("shun2","123"));
    }
}

// 數據傳輸對象(建議實現 Serializable)
public class Reader implements Serializable {
    private String name, password;
    // 構造、get/set、toString 省略
}

3. 服務配置 (META-INF/xfire/services.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://xfire.codehaus.org/config/1.0">
  <service>
    <name>readerService</name>                    <!-- 服務名,調用時用 -->
    <namespace>https://test/HelloService</namespace>
    <serviceClass>com.xfire.servlet.IReaderService</serviceClass>
    <implementationClass>com.xfire.servlet.ReaderService</implementationClass>
  </service>
</beans>

放置於 src/META-INF/xfire/services.xml,IDE 會隨項目部署到 WEB-INF/classes。

4. web.xml 配置 XFire Servlet

<servlet>
  <servlet-name>XFireServlet</servlet-name>
  <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
  XFireServlet
  /services/*
</servlet-mapping>

5. 驗證 WSDL 生成

啟動 Tomcat,訪問:

https://localhost:8080/你的項目/services/readerService?wsdl

瀏覽器顯示 XML 即發布成功。

6. 客戶端調用

import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class ReaderClient {
    public static void main(String[] args) throws MalformedURLException {
        // 1. 創建服務模型(基於接口)
        Service serviceModel = new ObjectServiceFactory().create(IReaderService.class);
        // 2. 創建代理工廠
        XFireProxyFactory factory = new XFireProxyFactory();
        // 3. 服務地址(不帶 ?wsdl)
        String url = "https://localhost:8080/你的項目/services/readerService";
        // 4. 獲取代理並調用
        IReaderService proxy = (IReaderService) factory.create(serviceModel, url);
        Reader reader = proxy.getReader("shun", "123");
        System.out.println(reader); // Name:shun,Password:123
    }
}

7. WSDL 結構深度解析

WSDL (Web Services Description Language) 是描述 Web 服務的 XML 文檔,包含 7 大核心元素:

元素作用
types數據類型定義容器,通常用 XML Schema 定義複雜類型
message通信消息的抽象定義,由 part 組成,引用 types 中的元素
portType操作的抽象集合(類比 Java 接口),包含 input/output 消息
binding將 portType 綁定到具體協議(如 SOAP/HTTP)和編碼格式
port單個服務端點:綁定 + 網絡地址
service相關端口的集合
import導入其他 WSDL/Schema 文件

關鍵結構示例

<definitions targetNamespace="..." ...>
  <types>
    <xsd:schema targetNamespace="...">
      <xsd:element name="sayHello"> ... </xsd:element>       <!-- 輸入類型 -->
      <xsd:element name="sayHelloResponse"> ... </xsd:element> <!-- 輸出類型 -->
    </xsd:schema>
  </types>
  <message name="sayHelloRequest">
    <part name="parameters" element="tns:sayHello"/>
  </message>
  <message name="sayHelloResponse">
    <part name="parameters" element="tns:sayHelloResponse"/>
  </message>
  <portType name="HelloServicePortType">
    <operation name="sayHello">
      <input message="tns:sayHelloRequest"/>
      <output message="tns:sayHelloResponse"/>
    </operation>
  </portType>
  <binding name="HelloServiceHttpBinding" type="tns:HelloServicePortType">
    <soap:binding transport="https://schemas.xmlsoap.org/soap/http"/>
    <operation name="sayHello">
      <soap:operation soapAction=""/>
      <input><soap:body use="literal"/></input>
      <output><soap:body use="literal"/></output>
    </operation>
  </binding>
  <service name="HelloService">
    <port name="HelloServiceHttpPort" binding="tns:HelloServiceHttpBinding">
      <soap:address location="https://host:port/services/HelloService"/>
    </port>
  </service>
</definitions>

遷移建議:XFire → Apache CXF

XFire 已停止維護,建議新項目或重構時遷移至 Apache CXF:

  • API 相似,遷移成本低。
  • 支援 JAX-WS、JAX-RS、Spring Boot Starter。
  • 活躍社區、安全更新、現代協議支援。

遷移核心步驟:替換依賴、調整配置命名空間、Servlet 類名改為 CXFServlet、客戶端用 JaxWsProxyFactoryBean。

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