2011-09-14 48 views
2

我想實現一個簡單的客戶端web服務的SOAP頭,我與web服務所面臨的唯一的問題是,它有一個通用的端點:http://myserver3333.com:8080/ws/services你查找Web服務的方式部署的是通過SOAP頭。問題與通過使用Apache CXF客戶

因此,舉例來說,如果你嘗試打服務可見SOAP UI,

  1. 我指定的終點是:http://myserver3333.com:8080/ws/services
  2. 在SOAP頭我具體如下:
    服務名稱= MyAwesomeService
    操作NAME = makeMeMoreAwesome

所以,我該怎麼辦使用Apache CXF的客戶端是一回事嗎?

我當前的代碼:

URL wsdlLocation = new URL("http://myserver3333.com:8080/ws/service"); 

    MyAwesomeService service = new MyAwesomeService(wsdlLocation); 
    MyAwesomeServicePort port = service.getMyAwesomeServiceSOAPPort(); 

    List<Header> headers = new ArrayList<Header>(); 
    Header operationNameHeader = new Header(new QName("OPERATION-NAME"), "makeMeMoreAwesome", 
              new JAXBDataBinding(String.class)); 
    Header serviceNameHeader = new Header(new QName("SERVICE-NAME"), "MyAwesomeService", 
              new JAXBDataBinding(String.class)); 

    headers.add(operationNameHeader); 
    headers.add(serviceNameHeader); 

    BindingProvider bindingProvider = (BindingProvider)port; 
    bindingProvider.getRequestContext().put(Header.HEADER_LIST, headers); 

    MakeMeMoreAwesomeRequest request = new MakeMeMoreAwesomeRequest(); 
    MakeMeMoreAwesomeResponse response = port.makeMeMoreAwesome(request); 

    System.out.println(response.getAck()); 

但是當我運行它,我得到這個錯誤:

Exception in thread "main" com.sun.xml.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException. 

java.io.IOException: Server returned HTTP response code: 500 for URL: http://myserver3333.com:8080/ws/services 
java.io.IOException: Server returned HTTP response code: 500 for URL: http://myserver3333.com:8080/ws/services?wsdl 

哪個是正確的,因爲在那個位置沒有WSDL,它需要按照肥皂頭來獲得服務。

更新:

從@Daniel庫爾普兩點後,我在這裏:

  1. 我添加了一個新行:bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://myserver3333.com:8080/ws/services");

現在我得到這個錯誤:

org.apache.cxf.binding.soap.SoapFault: "http://www.myserver.com/ws/services", the namespace on the "errorMessage" element, is not a valid SOAP version. 
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.readVersion(ReadHeadersInterceptor.java:115) 
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:141) 
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:771) 

我的假設是,這個錯誤是一樣this一。但我沒有使用?wsdl。那麼,有什麼建議?

回答

1

2意見:

1)您不接受CXF。檢查你的類路徑以確保CXF在那裏,而不是Sun/Oracle的實現。 com.sun.xml.ws.wsdl.parser.InaccessibleWSDLException顯示您正在選擇Sun實施。

2)通入MyAwesomeService(wsdlLocation的URL)必須是一個URL到WSDL,不端點本身。

+0

我看,當我輸入'進口javax.xml.ws.BindingProvider'我得到這樣的警告:訪問限制:該類型BindingProvider是無法訪問的,由於所需庫C的限制:\程序文件(x86)\ Java的\ JRE6 \ LIB \ rt.jar中。這只是一個警告,但我爲什麼要這樣做?什麼是替代呢? – zengr

+0

感謝您的回答,問題更新。 – zengr

+0

我將SOAP頭傳遞給服務的方式是否正確? – zengr