2012-03-14 2 views
0

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

У меня есть работа, использующая 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

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

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

Итак, теперь у меня есть service.addPort (HService.HAdminService, http://schemas.xmlsoap.org/soap/ "," https://something.com:7010/hservice?wsdl ");' И я получаю нулевой указатель на 'HAdminService calc = service.getHAdminService();' – crdzoba

+0

Как вы решаете эту проблему .. – user684434

0

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

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