2014-11-10 5 views
0

Это мой первый раз с CXF. Я пишу клиент, чтобы потреблять веб-сервис. Мое требование - написать клиенту, а также добавить перехватчик протоколирования. К сожалению, поставщик услуг не делает WSDL доступным через URL?wsdl. У меня есть все необходимое WSDLs and XSDs от поставщика услуг в zip-файле, и я должен использовать эту версию файлов для создания моего клиента. До сих пор я придерживался нескольких примеров и читал довольно много о клиентах CXF. Похоже, что правильный подход к запуску клиента правильный. Однако здесь это не работает. Мне нужна помощь в решении этого.Не удается получить доступ к веб-сервису с клиентом CXF, когда WSDL недоступен в сервисе URL

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(<SERVICE_CLASS_NAME>.class); <<I have the ".class for service here>> 
QName SERVICE_NAME = new QName(<<namespaceURI>>, <<ServiceName>>); 
factory.setServiceName(SERVICE_NAME); 
factory.setAddress(SERVICE_URL); 
factory.setWsdlLocation(localWSDLAddress); 
portType = factory.create(); 

Это отдельная программа-клиент, и я попробовал несколько комбинаций баночка файлов для запуска этой программы (подробности ниже). Программа не выходит за пределы последней строки, упомянутой в фрагменте кода выше. Трассировка исключения следующая.

Exception in thread "main" java.lang.AbstractMethodError: org.apache.cxf.binding.soap.SoapTransportFactory.createEndpointInfo(Lorg/apache/cxf/service/model/ServiceInfo;Lorg/apache/cxf/service/model/BindingInfo;Ljava/util/List;)Lorg/apache/cxf/service/model/EndpointInfo; 
at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildEndpoint(WSDLServiceBuilder.java:459) 
at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:356) 
at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:203) 
at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:175) 
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:408) 

Командная строка, используемая для запуска моей клиентской программы, которая содержит приведенный выше фрагмент кода. Я пришел к этому списку файлов jar через пробную версию и ошибку.

java -cp %CLASSPATH%;.;./cxf-core-3.0.2.jar;./cxf-rt-bindings-soap-3.0.2.jar;./cxf-rt-bindings-xml-3.0.2.jar;./cxf-rt-core-2.7.11.jar;./cxf-rt-frontend-simple-3.0.2.jar;./cxf-rt-ws-addr-3.0.2.jar;./cxf-rt-ws-policy-3.0.2.jar;./neethi-3.0.2.jar;./wsdl4j-1.6.3.jar;./xmlschema-core-2.1.0.jar;./cxf-rt-frontend-jaxws-3.0.2.jar;./cxf-bundle-3.0.0-milestone2.jar;./cxf-bundle-jaxrs-2.7.12.jar;./woodstox-core-asl-4.4.1.jar;./stax2-api-3.1.4.jar;./cxf-rt-databinding-jaxb-3.0.2.jar;./cxf-common-utilities-2.5.11.jar;./cxf-rt-transports-http-3.0.2.jar javaclass 

ответ

0

Включите WSDL как часть вашего проекта и сгенерируйте Java-код клиента/сервера.

Используйте CXF Maven плагин для генерации кода:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>${basedir}/src/main/resources/ws/booking-v1.wsdl</wsdl> 
         <wsdlLocation>classpath:ws/booking-v1.wsdl</wsdlLocation> 
         <bindingFiles> 
          <bindingFile>${basedir}/src/main/resources/bindings.xml</bindingFile> 
         </bindingFiles> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin>