簡體   English   中英

使用Apache CXF客戶端傳遞SOAP標頭的問題

[英]Problem with passing SOAP headers using Apache CXF client

我正在嘗試為Web服務實現一個簡單的客戶端,該Web服務面臨的唯一問題是,它具有通用端點: http://myserver3333.com:8080/ws/services : http://myserver3333.com:8080/ws/services : http://myserver3333.com:8080/ws/services /ws/services和您查找Web服務的方式部署是通過SOAP標頭進行的。

因此,例如,如果您嘗試通過SOAP UI訪問服務,

  1. 我指定的端點是: http://myserver3333.com:8080/ws/services : http://myserver3333.com:8080/ws/services : http://myserver3333.com:8080/ws/services
  2. 在SOAP標頭中,我具體說明了以下內容:
    SERVICE-NAME = MyAwesomeService
    OPERATION-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,它需要遵循soap標頭來獲取服務。

更新:

從@Daniel Kulp獲得兩點后,我在這里:

  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)

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

2條評論:

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

2)傳遞給MyAwesomeService(wsdlLocation)的URL必須是WSDL的URL,而不是端點本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM