Управление значениями атрибутов wsdlLocation JAX-WS (абсолютный путь) с помощью jaxws-maven-plugin - PullRequest
19 голосов
/ 21 марта 2012

У меня есть веб-сервис, управляемый JAX-WS, для которого WSDL генерирует клиент веб-сервиса в другом модуле Maven (который я назову ws-consumer).

К лучшему или худшему, мы копируем«опубликованные WSDL» (версия WSDL и XSD, которые служба хранила / сгенерировала в момент выпуска) в нашу папку src/wsdl из ws-consumer, а затем используйте jaxws-maven-plugin из org.jvnet для генерации клиента с использованием jaxws:wsimport со следующей (усеченной) конфигурацией:

    <plugin>
        <groupId>org.jvnet.jax-ws-commons</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.1</version>
        <executions>
            <execution>
                <!--phase>generate-sources</phase -->
                <goals>
                    <goal>wsimport</goal>
                </goals>
                <configuration>
                    <wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory>
                    <wsdlFiles>
                        <wsdlFile>MyWS/MyWS.wsdl</wsdlFile>
                    </wsdlFiles>
                </configuration>
            </execution>
        </executions>
    </plugin>

Теперь сгенерированный код клиента имеет следующие аннотации, применяемые на уровне класса:

@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)

выделение шахты

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

Есть ли способ, которым яМожно ли "контролировать" это, установив его на META-INF/wsdl/MyWS/MyWS.wsdl или на другое значение?

Ответы [ 4 ]

13 голосов
/ 21 марта 2012

Это возможно с помощью плагина Codehaus:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>jaxws-maven-plugin</artifactId>
   <version>1.9</version>
   <executions>
     <execution>
       <goals>
         <goal>wsimport</goal>
       </goals>
     </execution>
   </executions>
   <configuration>
     <keep>true</keep>
     <verbose>true</verbose>
     <wsdlDirectory>../wscontract/src/main/resources/wsdl</wsdlDirectory>
     <wsdlLocation>wsdl/MaintainAddress.wsdl</wsdlLocation>
     <sourceDestDir>src/main/java</sourceDestDir>
     <bindingDirectory>.</bindingDirectory>
     <bindingFiles>
       <bindingFile>jaxb/xsdbindings.xml</bindingFile>
       <bindingFile>jaxb/wsdlbindings.xml</bindingFile>
     </bindingFiles>
   </configuration>
</plugin>

Возможно, используемый вами плагин имеет аналогичную опцию или, возможно, вы можете подумать о переключении.

Вы также можете явно настроить свой WSDL, в этом случае это свойство игнорируется, хотя это может не подходить для приложения, управляемого контейнером.

Пример кода здесь .

7 голосов
/ 09 января 2014

Используйте wsdlLocation с плагином jaxws-maven из org.jvnet.jax-ws-commons:

<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
    <execution>
        <goals>
            <goal>wsimport</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
    <wsdlFiles>
        <wsdlFile>arsdev.wsdl</wsdlFile>
    </wsdlFiles>
    <wsdlLocation>wsdl/*</wsdlLocation>
    <!-- Keep generated files -->
    <keep>true</keep>
    <packageName>jaxws.remedy.client.generated</packageName>
    <!-- generated source files destination -->
    <sourceDestDir>target/generated-code/src</sourceDestDir>
</configuration>
</plugin>
0 голосов
/ 26 июля 2017

Я проголосовал за ответ @ dean-schulze, так как он подходит для случая org.jvnet.jax-ws-commons: jaxws-maven-plugin plugin.

Itтакже может быть интересно отобразить справку локально с CLI, например:

mvn jaxws:help -Dgoal=wsimport -Ddetail

Как сказано в предыдущем ответе, мы можем использовать параметр wsdlLocation , описанный здесь:

wsdlLocation
  @WebService.wsdlLocation and @WebServiceClient.wsdlLocation value.
  Can end with asterisk in which case relative path of the WSDL will be
  appended to the given wsdlLocation.

  Example:

   ...
   <configuration>
   <wsdlDirectory>src/mywsdls</wsdlDirectory>
   <wsdlFiles>
   <wsdlFile>a.wsdl</wsdlFile>
   <wsdlFile>b/b.wsdl</wsdlFile>
   <wsdlFile>${basedir}/src/mywsdls/c.wsdl</wsdlFile>
   </wsdlFiles>
   <wsdlLocation>http://example.com/mywebservices/*</wsdlLocation>
   </configuration>
   ...
  wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl
  wsdlLocation for b/b.wsdl will be
  http://example.com/mywebservices/b/b.wsdl
  wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be
  file://absolute/path/to/c.wsdl


  Note: External binding files cannot be used if asterisk notation is in
  place.

Параметр -wsdllocation также задокументирован для команды wsimport из JDK:

Но он просто говорит (см. @ WebServiceClient javadoc ):

Specifies the @WebServiceClient.wsdlLocation value.
0 голосов
/ 09 января 2014

Версия 1.12 не распознает <wsdlLocation>. Жалуется:

 No WSDLs are found to process, Specify atleast one of the following parameters: wsdlFiles, wsdlDirectory or wsdlUrls.

Версия 1.9 (как в вашем примере) просто игнорирует все и не производит никакого кода.

Что-то должно было измениться.

...