背景
項目中接口通信用到了webservice服務,在具體應用中,調用方並非直接訪問服務方,而是通過代理轉發請求以實現訪問。
問題
使用 apache axis1.4 工具生成調用服務的客戶端代碼可以正常訪問;使用apache cxf 工具生成的客戶端代碼卻報錯:2 counts of InaccessibleWSDLException。
原因
axis 客戶端代碼是將服務名(service name)、端口名(portType)等信息固定地寫在生成的代碼中;而cxf客戶端代碼是在調用接口之前,通過GET獲取到wsdl文件進行解析,綁定服務名與端口名等信息。

在項目中,由於使用了代理重定向接口地址,無法通過GET直接獲取到wsdl文件進行解析,故報錯。
對策
將wsdl文件存儲在本地,客戶端讀取本地的wsdl文件。
在客戶端xxxService.java中的注解@WebServiceClient()中重新指定wsdlLocation指向classpath中的wsdl文件。
若要變更接口服務的地址,有兩種方式:
- a. 將地址寫在wsdl文件中的soap地址標簽中
<service name="xxxService">
<port binding="xxxSOAPBinding" name="xxxSOAPPort">
<soap:address location="http://yourActualAddress/xxxService"/>
</port>
</service>
- b. 更改調用的代碼,重新指定接口服務的地址。
xxxService ss = new xxxService(null, SERVICE_NAME);
XXXServicePortType port = ss.getxxxSOAPPort();
// XXXServicePortType port = ss.getPort(xxxServicePortType.class);
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext()
.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://www.example.com/real_endpoint_url_goes_here");
Response res = port.yourMethods(...);
