Использование CXF с WSDL с неопубликованными метаданными - PullRequest
0 голосов
/ 14 марта 2012

Я использую CXF для связи с WSDL, созданным в WCF. WCF сторона вещей была создана после учебник . Код Java был сгенерирован с использованием скрипта Maven.

Я получил работу с использованием HTTPS для шифрования. Я получил аутентификацию работает. Однако я хотел бы отключить метаданные WSDL на стороне WCF и при этом иметь возможность использовать сторону Java для связи со службой.

В настоящее время я могу получить доступ к службе с публикацией метаданных со стороны Java, используя этот код:

URL wsdlLocation = new URL("https://server.com:7010/Hservice?wsdl");
HttpsURLConnection connection = (HttpsURLConnection) wsdlLocation.openConnection();
HService service = new HService(wsdlLocation);
HAdminService calc = service.getHAdminService();
... (authentication using WSS4JOutInterceptor code and unrelated code here)
System.out.println(calc.add(new Double(5), new Double(5)));

Однако, когда я отключаю публикацию метаданных на стороне WCF, я получаю эту ошибку:

Exception in thread "main" javax.xml.ws.WebServiceException:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:90)
    at javax.xml.ws.Service.<init>(Service.java:56)
    at com.blah.hservice.v_1_0.HService.<init>(HService.java:49)
    at Main.main(Main.java:85)`

Страница, на которой находится wsdl, отображает это с отключенной публикацией метаданных (это отрывок):

This is a Windows© Communication Foundation service.

 Metadata publishing for this service is currently disabled.

If you have access to the service, you can enable metadata publishing by completing the following steps to modify your web or application configuration file:

Я ожидал, что смогу найти «метаданные CXF неопубликованные» и увидеть, как многие люди делают это ... но ничего не нашли. Как мне связаться с этим сервисом без публикации WSDL?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

У вас действительно есть два варианта:

  1. Скопируйте локально wsdl и укажите клиенту локальный wsdl.Вероятно, это «лучший» вариант, поскольку он гарантирует, что вся информация в wsdl (например, политики и т. Д.) Используется.
  2. Используйте «null» для расположения wsdl (примечание: не переносимый JAX-WS),Вам нужно будет вызвать service.addPort (....) после создания службы и перед вызовом getHAdminService, чтобы добавить порт с соответствующим адресом привязки и конечной точки.CXF может работать большую часть времени без WSDL (внутренне будет генерировать то, что нужно из аннотаций).Однако если такие вещи, как политики, определены в WSDL, то это невозможно.
0 голосов
/ 08 февраля 2013

Я получил это для работы с клиентским кодом, сгенерированным с использованием CXF 2.6.5

Убедитесь, что QName (первый аргумент) совпадает с QName, на который ссылается метод getHAdminService (). BindingId (второй аргумент) должен быть одной из констант, определенных в интерфейсе SOAPBinding (javax.xml.ws.soap.SOAPBinding).

...