【问题标题】:Problem with passing SOAP headers using Apache CXF client使用 Apache CXF 客户端传递 SOAP 标头的问题
【发布时间】:2011-09-14 12:18:20
【问题描述】:

我正在尝试为 web 服务实现一个简单的客户端,我面临的 web 服务的唯一问题是,它有一个通用端点:http://myserver3333.com:8080/ws/services 并且您查找部署的 web 服务的方式是通过 SOAP 标头。

因此,例如,如果您尝试通过 SOAP UI 访问服务,

  1. 我指定的端点是:http://myserver3333.com:8080/ws/services
  2. 在 SOAP 标头中,我指定了以下内容:
    服务名称 = MyAwesomeService
    操作名称 = 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)

我的假设是,这个错误和this 一样。但我没有使用 ?wsdl。那么,有什么建议吗?

【问题讨论】:

    标签: java web-services soap cxf


    【解决方案1】:

    2 厘米:

    1) 你没有选择 CXF。检查您的类路径以确保存在 CXF 而不是 Sun/Oracle 实现。 com.sun.xml.ws.wsdl.parser.InaccessibleWSDLException 表明您正在使用 Sun 实现。

    2) 传递给 MyAwesomeService(wsdlLocation) 的 URL 必须是 WSDL 的 URL,而不是端点本身。

    【讨论】:

    • 我明白了,当我导入 import javax.xml.ws.BindingProvider 时,我收到此警告:访问限制:由于所需库 C:\Program Files (x86)\Java\jre6\ 的限制,无法访问类型 BindingProvider库\rt.jar。这只是一个警告,但我为什么会这样呢?有什么替代方案?
    • 是的。您可能需要打开 Logging 内容以查看有效负载。看起来您正在从服务器返回一个通用错误页面(可能是 404?),而不是 SOAP 消息。
    • 我得到了我的问题的答案,问题是服务不支持soap headers,但是http headers!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多