Home‎ > ‎Apuntes‎ > ‎

Generación de clientes para WebServices con Maven

Con Maven la generación de clientes es, como siempre, más simple y declarativa.
Se requieren los siguientes pasos:

1) Crear un proyecto Maven de cualquier tipo. Con un standalone alcanza para consumir cualquier web service. Como vimos, con Eclipse basta con hacer new->Maven Project y seguir los pasos.

2) Agregar al POM las siguientes dependencias:

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.3.1</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Desde nuestro querido plugin de eclipse, esto se vería de esta manera:


3) Agregar al POM los siguientes plugins:

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>DIR_DEST</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>URL_WSDL</wsdl>
                                    <extraargs>
                                        <extraarg>-verbose</extraarg>
                                    </extraargs>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

A continuación, una captura de los plugins que indicamos desde la vista del m2eclipse: (maven-compiler-plugin y cxf-codegen-plugin).


4) Finalmente hacemos mvn generate-sources y obtendremos los artefactos deseados.
Éstos se generarán a partir del wsdl publicado en URL_WSDL, y serán colocados en el directorio que indiquemos en DIR_DEST.

El proceso llevado a cabo, es el que indica el goal (wsdl2java), es decir, generar los fuentes a partir de un wsdl publicado.

En el apunte de Generación de WebServices con Maven y CXF, se llevó a cabo el proceso inverso (java2wsdl), es decir, se generó un WSDL a partir de las clases desarrolladas en Java para el servicio.

Consumiendo el Ejemplo HelloWorld

En la guía de Generación de Web Services desplegamos el ejemplo que viene con el Archetype de Maven, llamado HelloWorld.
Si seguimos los pasos mencionados anteriormente, colocando:

URL_WSDL: La URL correspondiente al servicio desplegado.
DIR_DEST: El directorio de nuestro proyecto donde deseemos que se coloquen los artefactos.

Obtendremos los archivos generados a partir de las definiciones del WSDL publicado, que nos servirán para consumir el servicio desde cualquier cliente, y estos archivos serán ubicados en DIR_DEST.
Deberíamos obtener estas clases:


Lo que resta es consumir el servicio, empleando los artefactos generados.
Para ello, dentro de un test, o un main, utilizaremos el siguiente código:

        HelloWorldImplService service = new HelloWorldImplService();    (1)
        HelloWorld port = service.getPort(HelloWorld.class);                  (2)
        String rta = port.sayHi("TACS");                                               (3)
        System.out.println(rta);                                                            

(1): Obtenemos el factory a través del cual generaremos los proxies que nos permitirán consumir los servicios.
(2): Obtenemos el Port, un proxy con el cual podremos acceder a los servicios publicados, en forma de objetos.
(3): Invocamos el servicio a través del proxy y obtenemos el resultado (es bloqueante).

Con esto Finalizamos el ejemplo inicial de publicación del Web Service y creación de clientes para consumirlo.
Comments