CXF 客戶端不依賴服務端接口 Jar,僅憑服務 URL 和參數(如 String)動態調用方法。
org.apache.cxf.jaxws.JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("https://host:port/service?wsdl");
// 調用:方法名,參數...
Object[] result = client.invoke("methodName", "paramString");
System.out.println(result[0]);
public Object callWebService(String wsdlUrl, String methodName, Object... params) {
try {
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient(wsdlUrl);
// 可設置超時
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(5000);
policy.setReceiveTimeout(10000);
conduit.setClient(policy);
return client.invoke(methodName, params)[0];
} catch (Exception e) {
throw new RuntimeException("動態調用失敗: " + e.getMessage(), e);
}
}
// 調用
String result = (String) callWebService("https://localhost:8080/ws/user?wsdl", "getUserName", "user123");
cxf-rt-frontend-jaxws、cxf-rt-transports-http 等依賴。WebClient 或 HttpClient。XMLBeans 或手動構造 DOM)。**動態調用適合集成測試、網關轉發、無代碼生成場景,生產核心業務仍建議生成客戶端代碼編譯期檢查。**