XFire 是早期 Java WebService 框架(現已併入 Apache CXF),仍有存量系統在用。本文記錄從環境搭建、服務發布、WSDL 生成到客戶端調用的完整流程,並補充 WSDL 結構深度解析,助力維護老項目或理解 WebService 基礎。
WEB-INF/lib。xfire-core、xfire-java5、xfire-jsr181-api、aegis、wstx 等。// 接口(必須,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 省略
}
<?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。
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
XFireServlet
/services/*
</servlet-mapping>
啟動 Tomcat,訪問:
https://localhost:8080/你的項目/services/readerService?wsdl
瀏覽器顯示 XML 即發布成功。
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
}
}
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:
遷移核心步驟:替換依賴、調整配置命名空間、Servlet 類名改為 CXFServlet、客戶端用 JaxWsProxyFactoryBean。