CXF 調用webservice客戶端報錯:2 counts of InaccessibleWSDLException


背景

項目中接口通信用到了webservice服務,在具體應用中,調用方並非直接訪問服務方,而是通過代理轉發請求以實現訪問。

問題

使用 apache axis1.4 工具生成調用服務的客戶端代碼可以正常訪問;使用apache cxf 工具生成的客戶端代碼卻報錯:2 counts of InaccessibleWSDLException。

原因

axis 客戶端代碼是將服務名(service name)、端口名(portType)等信息固定地寫在生成的代碼中;而cxf客戶端代碼是在調用接口之前,通過GET獲取到wsdl文件進行解析,綁定服務名與端口名等信息。
image
在項目中,由於使用了代理重定向接口地址,無法通過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(...);

參考自:Instantiate JAX-WS service without downloading WSDL?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM