Создание клиента веб-сервиса прямо из источника - PullRequest
5 голосов
/ 25 января 2010

Я пытаюсь сгенерировать клиентский jar-файл WS непосредственно из класса (ов) @Webservice.

Давайте рассмотрим этот пример:

   package com.example.maven.jaxws.helloservice;
   import javax.jws.WebService;
   @WebService
   public class Hello {
     public String sayHello(String param) {
     ;  return "Hello " + param;
     }
   }  

Я могу сгенерировать файл войны и использовать glassfish для обслуживания этого веб-сервиса, а оттуда я могу использовать URL-адрес WSDL glassfish для генерации клиентских источников.

Что я пытаюсь сделать, это пропустить часть Glassfish. Из моего проекта maven, определяющего веб-сервис, я хотел бы использовать jaxws-maven-plugin для создания клиентских классов, но не могу найти способ указать фактический URL-адрес веб-сервиса.

Это должно быть возможно, верно?

@ см. Также Создание клиента веб-службы с известным, но недоступным wsdl

Ответы [ 2 ]

5 голосов
/ 25 января 2010

Создание клиентского приложения веб-службы всегда начинается с существующего файла WSDL (в отличие от разработки поставщика веб-службы), и, даже если это не единственный способ, я бы предложил использовать инструмент wsimport (см. 5 методов создания веб-служб Java из WSDL для других опций, но я не буду их освещать).

Итак, в вашем клиентском проекте добавьте следующий фрагмент к вашему pom.xml:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>jaxws-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>wsimport</goal>
          </goals>
          <configuration>
            <wsdlUrls>
              <wsdlUrl>
                http://localhost:8080/helloservice/HelloService?wsdl
              </wsdlUrl>
            </wsdlUrls>
            <packageName>com.example.maven.jaxws.helloclient</packageName>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
<bulid>

Модем jaxws-maven-plugin:wsimport по умолчанию связан с фазой жизненного цикла generate-sources, поэтому выполнение любой фазы, следующей за generate-sources, приведет к достижению цели jaxws:wsimport.

Обратите внимание, что это действительно минимальная конфигурация. Если вы хотите больше деталей / контроля, проверьте документацию wsimport mojo.

Например, чтобы использовать файлы вместо URL-адресов для WSDL (и генерировать код Java в месте, более совместимом с лучшими практиками maven), используйте:

<configuration>
  <sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir>
  <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory>
  <wsdlFiles>
    <wsdlFile>foo.wsdl</wsdlFile>
    <wsdlFile>bar.wsdl</wsdlFile>
  </wsdlFiles> 
  ...
</configuration>

Обновление: Чтобы вызвать предварительно сконфигурированную заглушку (используя адрес конечной точки из WSDL), код:

Hello port = new HelloService().getHelloPort();
String result = port.sayHello("Duke!");

Чтобы вызвать конечную точку, адрес которой отличается от адреса, указанного в WSDL, определите новый URL-адрес конечной точки и QName:

URL endpoint_new = new URL( "NEW_ADDRESS_HERE" );
QName qname = new QName( "http://"+"ORIGINAL_PACKAGE", "SERVICENAME" );
Hello port = new HelloService( endpoint_new, qname ).getHelloPort();

где ORIGINAL_PACKAGE - это пакет, в котором опубликована служба, SERVICENAME - это название службы, которая нам нужна, например, HelloService.

.
3 голосов
/ 26 января 2010

Вы должны использовать опцию <wsdlLocation>, чтобы указать расположение службы, где файл WSDL будет доступен после развертывания.

Использование ключа -wsdlLocation

Есть еще один простой способ сделать это - просто запустите wsimport с -wsdlLocation переключиться и указать местоположение WSDL значение, которое относительно сгенерированный класс обслуживания и вам нужно поместить этот файл WSDL в этот родственник место.

См. Сообщение для более подробной информации .

...