Объединение wsdl в банку с помощью CXF wsdl2java

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

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

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

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

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

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

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

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

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


person Andre Azzolini    schedule 23.02.2011    source источник


Ответы (3)


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

<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>
person Srimathi    schedule 24.10.2012
comment
Это имеет смысл. Я больше не работаю активно над проектом, в котором мне нужна была эта функциональность, но я приму ваш ответ, поскольку он кажется разумным решением проблемы. Спасибо! - person Andre Azzolini; 31.01.2013

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

  1. Храните свои wsdls в src/main/resources/wsdl

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

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

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

person mtpettyp    schedule 25.02.2011
comment
Для меня идеальным решением было бы то, что кто-то, использующий JAR, который я делаю, который предоставляет заглушку для WSDL, не должен знать НИЧЕГО о файле WSDL. Я согласен с вашим обходным путем (это то же самое, о чем я упоминал в своем посте), но я не хочу указывать что-либо о файле .wsdl вне JAR. - person Andre Azzolini; 28.02.2011
comment
Это объясняет причины, по которым вам необходимо упаковать файлы wsdl -jax-ws.java .net/faq/index.html#wsdl_at_runtime. По крайней мере, они собираются сделать его немного чище в будущем. - person mtpettyp; 28.02.2011

Документация 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/");
person rob2universe    schedule 10.04.2013