許多初學者聽到「介面」或「WebService」就感到困惑。實際上,WebService 就是基於 HTTP 協議的遠程過程調用(RPC),它讓不同語言、不同平台的系統透過 XML(SOAP)交換資料。本文將手把手教你使用 JDK 內建的 JAX-WS 發布服務、解析 WSDL、生成客戶端代碼,並用 TCP Monitor 抓包分析 SOAP 通訊細節。
| 術語 | 說明 |
|---|---|
| JAX-WS | Java API for XML Web Services,JDK 1.6+ 內建標準 |
| WSDL | Web Services Description Language,服務的「說明書」(XML 格式) |
| SOAP | Simple Object Access Protocol,基於 XML 的訊息封裝協議 |
| wsimport | JDK 內建工具,根據 WSDL 生成客戶端調用代碼 |
@WebService
public class HelloService {
public String sayHello(String name) {
System.out.println("sayHello() called");
return "Hello " + name;
}
public String sayHello2(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
// 發布到 https://127.0.0.1:6789/hello
Endpoint.publish("https://127.0.0.1:6789/hello", new HelloService());
System.out.println("Server ready...");
}
}
關鍵點:
@WebService 會將所有非 static、非 final 的 public 方法暴露@WebMethod(exclude=true) 可隱藏特定方法Endpoint.publish() 內部啟動一個 ServerSocket 監聽請求瀏覽器訪問:https://127.0.0.1:6789/hello?wsdl
WSDL 關鍵結構解讀(自下而上閱讀):
<service> → 服務名稱,對應客戶端 HelloServiceService 類<port> → 端點,name 對應 getHelloServicePort()<binding> → 綁定協議(SOAP over HTTP)<portType> → 介面定義,<operation> 即方法<message> → 輸入/輸出參數結構<types> → XML Schema 定義資料類型# 在命令列執行
wsimport -s . -p com.intsmaze.client https://127.0.0.1:6789/hello?wsdl
-s .:源碼生成到當前目錄(注意 -s 後有空格再接點)-p:指定包名.java 和 .class,可直接複製到專案使用public class App {
public static void main(String[] args) {
// 1. 建立 Service 對應 wsdl:service
HelloServiceService service = new HelloServiceService();
// 2. 獲取 Port 對應 wsdl:port
HelloService port = service.getHelloServicePort();
// 3. 像呼叫本地方法一樣調用
String result = port.sayHello("intsmaze");
System.out.println(result); // 輸出:Hello intsmaze
}
}
內部實際發送 SOAP 請求,接收 SOAP 響應,完全屏蔽了網路通訊細節。
使用 TCP/IP Monitor(Eclipse 內建)或 Wireshark 攔截:

@XmlSeeAlso 或 @XmlType 控制序列化JAX-WS 讓 WebService 發布與調用變得極其簡單:註解標記 → Endpoint 發布 → wsimport 生成代碼 → 像本地調用一樣使用。理解 WSDL 結構與 SOAP 封包格式,有助於排查跨語言調用時的序列化、協議不匹配等問題。