Пакетирование wsdl в банке с CXF wsdl2java - PullRequest
3 голосов
/ 23 февраля 2011

Я работаю над реализацией, которая будет использовать wsdl, который я получил от поставщика.Наш проект работает на Spring и CXF, и я хотел бы создать jar, который позволит мне получить доступ к службам wsdl этого поставщика, но я сталкиваюсь с проблемами пути к классам.

Использование wsdl2java в CXF Я могудля генерации кода, который действует следующим образом:

WSDL_LOCATION = new URL("file:SomeService.wsdl");

Служба требует, чтобы wsdl находился в пути к классам, но я хотел бы связать его в jar-файле, чтобы его можно было распространять как отдельный jar-файл.Используя инструмент wsdl2java, я могу указать строку в экземпляре URL для того, что я хотел бы.Тем не менее, я не нашел комбинацию пользовательской строки и расположения файла wsdl внутри фляги, которая работает.

Единственный способ заставить это работать так, как я хочу, это поместить файл wsdl в ту же папкучто SomeService.class является и использует следующую строку:

WSDL_LOCATION = TrackService.class.getResource("TrackService_v4.wsdl");

Однако у меня есть недостаток в том, что мне приходится вручную редактировать код Java и компилировать его самостоятельно.Это нежелательно, потому что мы в конечном итоге хотели бы сделать этот процесс частью нашей сборки maven и сделать так, чтобы wsdl2java самостоятельно генерировал и компилировал.

Я в порядке, когда wsdl находится где-нибудь в банке, но я неНе знаю, что передать в wsdl2java, чтобы он ссылался на файл внутри фляги.

У кого-нибудь есть какие-либо предложения или опыт в этом деле?

Ответы [ 3 ]

3 голосов
/ 24 октября 2012

Вам нужно указать расположение wsdl classpath следующим образом, чтобы сгенерировать заглушки, которые используют ClassLoader для загрузки этого wsdl в качестве ресурса classpath:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.4.3</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-bindings-soap</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf
                </sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/yourWSDL.wsdl</wsdl>
                        <extraargs>
                            <extraarg>**-wsdlLocation**</extraarg>
                            <extraarg>**classpath:yourWSDL.wsdl**</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>
2 голосов
/ 10 апреля 2013

Документация CXF решает его таким же образом:

 URL wsdl = getClass().getResource("wsdl/greeting.wsdl");
 SOAPService service = new SOAPService(wsdl, serviceName);

Другой предоставляемый параметр - JaxWsProxyFactoryBean:

JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
proxyFactory.setServiceClass(MyService.class);
proxyFactory.setWsdlLocation("/wsdl/MyService.wsdl");

Если вам также необходимо настроитьURL конечной точки, то вы можете добавить:

proxyFactory.setAddress("http://192.168.0.2:6666/");
2 голосов
/ 25 февраля 2011

Я столкнулся с той же проблемой - у меня есть следующий обходной путь, но я все еще ищу что-то более чистое.

  1. Держите ваши wsdls в src / main / resources/ wsdl

  2. При создании TrackService выполните следующие действия:

    URL wsdlUrl = TrackService.class.getResource ("/wsdl/TrackService_v4.wsdl");Сервис TrackService = новый TrackService (wsdlUrl);

Идеальным решением было бы передать местоположение как элемент <wsdlLocation/> в плагин CXF wsdl2java.Тогда ваш клиентский код может вызвать конструктор по умолчанию.Однако генерируемый код заглушки не позволяет указать файл wsdl, который находится в пути к классам.

...