Невозможно получить доступ к веб-сервису с клиентом CXF, когда WSDL недоступен по URL-адресу сервиса
Это мой первый раз с CXF. Я пишу клиент для использования веб-службы. Мое требование состоит в том, чтобы написать клиента и также добавить перехватчик регистрации. К сожалению, поставщик услуг не делает WSDL
доступны через URL?wsdl
, У меня есть все необходимое WSDLs and XSDs
от поставщика услуг в zip-файле, и я должен использовать эту версию файлов для сборки моего клиента. До сих пор я следовал нескольким примерам и много читал о CXF
клиентов. Кажется, что следующий подход для запуска клиента является правильным. Однако, это не работает здесь. Мне нужна помощь в решении этого.
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();
Это отдельная клиентская программа, и я пробовал несколько комбинаций jar-файлов для запуска этой программы (подробности приведены ниже). Программа не запускается после последней строки, упомянутой в фрагменте кода выше. Трассировка исключения заключается в следующем.
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
1 ответ
Включите 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>