Проблема с передачей SOAP-заголовков с использованием клиента Apache CXF - PullRequest
2 голосов
/ 14 сентября 2011

Я пытаюсь реализовать простой клиент для веб-сервиса, единственная проблема, с которой я сталкиваюсь с веб-сервисом, заключается в том, что он имеет общую конечную точку: http://myserver3333.com:8080/ws/services и способ поиска развернутых веб-сервисов - через заголовок SOAP.

Так, например, если вы пытаетесь подключиться к сервису через интерфейс SOAP,

  1. конечная точка, которую я указываю: http://myserver3333.com:8080/ws/services
  2. В заголовках SOAP я указываю следующее:
    SERVICE-NAME = 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, для получения службы нужно следовать заголовку мыла.

Обновление:

После двух очков от @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. Итак, есть предложения?

1 Ответ

1 голос
/ 14 сентября 2011

2 комментария:

1) Вы не принимаете CXF. Проверьте ваш путь к классу, чтобы убедиться, что здесь есть CXF, а не реализация Sun / Oracle. com.sun.xml.ws.wsdl.parser.InaccessibleWSDLException показывает, что вы выбираете реализацию Sun.

2) URL, передаваемый в MyAwesomeService (wsdlLocation), ДОЛЖЕН быть URL-адресом WSDL, а не самой конечной точкой.

...