Какой плагин лучше всего подходит для создания клиента веб-службы? - PullRequest
22 голосов
/ 28 августа 2010

Мне нужно сгенерировать клиент WS, и я не могу решить, какой плагин использовать. До сих пор у меня есть варианты: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

Ответы [ 3 ]

32 голосов
/ 03 октября 2010

Мне нужно сгенерировать клиент WS, и я не могу решить, какой плагин использовать. До сих пор у меня есть следующие варианты: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

Во-первых, jaxb2-maven-plugin на самом деле не предназначен для генерации клиентов WS. УСТРАНЕНЫ.

Во-вторых, лично Я бы не стал использовать Axis даже для клиентской разработки , поэтому я не рекомендую использовать axistools-maven-plugin. УСТРАНЕНЫ.

Это оставляет нам JIX-WS RI и стеки Apache CXF и их соответствующие плагины Maven: JAX-WS Maven Plugin (инструкции по использованию JAX-WS Maven Plugin можно найти на Использование страница) и cxf-codegen-plugin .

Относительно плюсов и минусов, я бы суммировал их так:

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

5 голосов
/ 02 октября 2010

Я использую jaxws-maven-plugin. На мой взгляд, JAX-WS является де-факто стандартной реализацией для WS. У него гораздо лучше сгенерированный код, чем у AXIS, и его проще настраивать и реализовывать. Поддерживается Maven и Spring.

Генерация клиентского кода из файла wsdl, в pom.xml:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>generate-reports-ws-code</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>

<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution -->                            <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile>
                        <packageName>com.acme.reports.ws.api</packageName>
                        <wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory>
                        <wsdlFiles>
                            <wsdlFile>InternalReportsAPIService.wsdl</wsdlFile>
                        </wsdlFiles>
                        <verbose>true</verbose>
                        <sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Интерфейс для создания компонента службы клиента (он не генерируется автоматически):

public interface InternalReportsAPIServiceFactory {

    public InternalReportsAPIService createInternalReportsAPIService();

}

Его реализация Бина:

public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory {

    private URL acmeReportsWsdlURL;

    private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService");

    @Override
    public InternalReportsAPIService createInternalReportsAPIService() {
        return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME);
    }

    public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) {
        try {
            this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl);
        } catch (MalformedURLException ex) {
            throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex);
        }
    }
}

Идея в этом bean-компоненте (используемом как Spring bean-компоненте) состоит в том, чтобы иметь синглтон для генерации кода службы клиента. Для этого требуется два ввода: URL-адрес WSDL, то есть фактический URL-адрес сервера, который реализует WSDL. Код клиентского сервиса при создании отправляет запрос на получение WSDL по указанному URL. Затем он создает WSDL на основе аннотаций, находящихся в автоматически сгенерированном коде, и сравнивает его. Я считаю, что это сделано, чтобы убедиться, что вы работаете с верной версией сервера. Итак, я поместил URL-адрес в файл свойств, доступный для моего приложения, поэтому я инициализирую его в файле контекста приложения Spring.

Вот пример использования фабрики для генерации сервиса и последующего его использования:

InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService();
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort();

Отсюда, просто используйте переменную порта для вызова любой операции, доступной в wsdl.

0 голосов
/ 04 апреля 2018

Требуются подключаемые модули Maven:

  • cxf-java2ws-plugin (от JAX-WS до WSDL)
  • cxf-codegen-plugin (от WSDL до Java)

JAX-WS - WSDL Чтобы сгенерировать документ WSDL из аннотированного класса JAX-WS, настроив плагин cxf-java2ws-target с целью java2ws.

Добавьте зависимость cxf-rt-frontend-jaxwsи зависимости проекта, необходимые для аннотированного класса JAX-WS в качестве зависимостей подключаемых модулей.

<plugin>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-java2ws-plugin</artifactId>
   <version>2.5.1</version>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>2.5.1</version>
      </dependency>
      <dependency>
         <groupId>com.medici.app</groupId>
         <artifactId>services</artifactId>
         <version>0.0.1-SNAPSHOT</version>
      </dependency>
   </dependencies>
   <executions>
      <execution>
         <id>generate-sources</id>
         <phase>generate-sources</phase>
         <configuration>
            <className>com.medici.app.services.WebServiceBean</className>
            <genWsdl>true</genWsdl>
         </configuration>
         <goals>
            <goal>java2ws</goal>
         </goals>
      </execution>
   </executions>
</plugin>

WSDL 2 Java Для создания клиента Java из документа WSDL путем настройки cxf-codegen-plugin с целью 'wsdl2java'.

Аргумент '-p' указывает классы пакета.

Сгенерированные классы будут помещены в папку target / generate-sources / cxf.

<plugin>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-codegen-plugin</artifactId>
   <version>2.5.1</version>
   <executions>
      <execution>
         <id>process-sources</id>
         <phase>generate-sources</phase>
         <configuration>
            <wsdlOptions>
               <wsdlOption>
                  <wsdl>${project.build.directory}/wsdl/WebService.wsdl</wsdl>
                  <extraargs>
                     <extraarg>-p</extraarg>
                     <extraarg>com.medici.app.client.model</extraarg>
                  </extraargs>
               </wsdlOption>
            </wsdlOptions>
         </configuration>
         <goals>
            <goal>wsdl2java</goal>
         </goals>
      </execution>
   </executions>
</plugin>
...