2010-01-25 19 views
5

Estoy intentando generar el contenedor de cliente WS directamente desde la clase @Webservice (es).Creación de un cliente de servicio web directamente desde la fuente

Tomemos este ejemplo:

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

que puede generar un archivo de la guerra y utilizar GlassFish para servir a este servicio web, y desde allí se puede utilizar la dirección URL de WSDL GlassFish para generar las fuentes de cliente.

Lo que trato de hacer es omitir la parte glassfish. Desde mi proyecto maven que define el servicio web, me gustaría utilizar el jaxws-maven-plugin para crear las clases de cliente pero no puedo encontrar ninguna forma de especificar la URL real del servicio web.

Debería ser posible, ¿verdad?

@see también Creating a web-service client with a known but inaccessible wsdl

Respuesta

3

Debe usar la opción <wsdlLocation> para dar la ubicación del servicio donde el archivo WSDL estará disponible después de la implementación.

Usando -wsdlLocation interruptor

Hay otra manera fácil de hacerlo - basta con ejecutar wsimport con -wsdlLocation interruptor y proporcionar el valor de la ubicación WSDL que es relativa a la clase de servicio generada y necesita para poner este archivo WSDL en esta ubicación relativa de .

See the post for more details.

+0

Entonces dice que debe descargar una copia del WSDL de una ejecución anterior. Para Metro esto puede ser difícil ya que contiene búsquedas adicionales. –

5

Creación de una aplicación cliente de servicios web siempre comienza con un archivo WSDL existente (a diferencia de la elaboración de un proveedor de servicios web) y, aunque esta no es la única manera, me gustaría sugerir a utilizar la herramienta wsimport (vea 5 Techniques for Creating Java Web Services from WSDL para otras opciones pero no las cubriré).

Así, en el proyecto de cliente, agregue el siguiente fragmento de su 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> 

El mojo jaxws-maven-plugin:wsimport está asociada de forma predeterminada a la fase del ciclo generate-sources vida para el funcionamiento de cualquier posterior fase de generate-sources activará el jaxws:wsimport Gol.

Tenga en cuenta que esta es realmente una configuración mínima. Si desea más detalles/control, consulte la documentación del wsimport mojo.

Por ejemplo, para utilizar archivos en lugar de URL para el WSDL (y para generar código Java en un lugar más compatible con Maven mejores prácticas), utilice:

<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> 

Actualización: para invocar un pre stub -configured (usando la dirección de punto final de la WSDL), el código es:

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

con el fin de invocar un punto final cuya dirección es diferente de la especificada en el WSDL, definir el nuevo URL de punto final y la 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(); 

donde ORIGINAL_PACKAGE es el paquete donde el servicio publicado en, SERVICENAME es el nombre del servicio que necesitamos, por ejemplo, HelloService.

+0

Si uso su última solución (generar el cliente desde un archivo wsdl), entonces el contenedor de cliente no contendrá la URL del servicio web. ¿Hay alguna manera de proporcionarlo con maven? Acabo de ver la etiqueta pero nada más ... – ben

+0

Esto fue muy útil; ¡gracias un montón! –

+1

Al usar '@ WebService' con Metro, el WSDL se genera en tiempo de ejecución y, por lo tanto, probablemente no esté disponible en tiempo de compilación. –

Cuestiones relacionadas