lunes, 24 de febrero de 2014

Implementando un cliente para un servicio en JAX-WS

Luego de ver como se implementa un servicio con JAX-WS y Metro, y desplegarlo en un contenedor de aplicaciones ahora quiero mostrarles cómo implementar un cliente para el servicio ya desplegado.

Para este caso creamos un proyecto en Maven, no usando el archetype de webapp, pues lo que queremos es un proyecto que nos genere un jar.

Una vez que tenemos el proyecto debemos modificar el pom para que queda algo como lo siguiente, ustedes hagan los cambios necesarios claro.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>jaxws4</groupId>
    <artifactId>jaxws4</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.8</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-xjc</artifactId>
            <version>2.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-io</artifactId>
            <version>2.0.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                            <wsdlFiles>
                                <wsdlFile>helloPersonService.wsdl</wsdlFile>
                            </wsdlFiles>
                            <packageName>cu.uci.cdae.ws.client</packageName>
                            <sourceDestDir>${basedir}/target/generated-sources/</sourceDestDir>
                            <keep>true</keep>
                            <bindingFiles>
                                <bindingFile>${basedir}/src/main/resources/wsdl/binding.xml</bindingFile>
                                <bindingFile>${basedir}/src/main/resources/wsdl/jaxb-binding.xml</bindingFile>
                            </bindingFiles>
                        </configuration>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.sun.xml.bind</groupId>
                        <artifactId>jaxb-xjc</artifactId>
                        <version>2.1.12</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.xml.ws</groupId>
                        <artifactId>jaxws-rt</artifactId>
                        <version>2.1.7</version>
                        <scope>compile</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
En la carpeta resources ponemos tanto el WSDL como el XSD en la misma ubicación, que como vimos en la entrada para crear la implementación del servicio y además en este caso añadimos 2 ficheros en la misma carpeta del WSDL. Estos ficheros son binding.xml y jaxb-binding.xml binding.xml
<bindings
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        wsdlLocation="./helloPersonService.wsdl"
        xmlns="http://java.sun.com/xml/ns/jaxws">
    <!-- Disable default wrapper style -->
    <enableWrapperStyle>false</enableWrapperStyle>

</bindings>
jaxb-binding.xml
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxb:globalBindings generateElementProperty="false" />
</jaxb:bindings>
Ahora solo tenemos que ejecutar el comando de Maven: mvn clean compile Y ya tendremos generadas las clases para consumir el servicio. La clase que implementará el cliente del servicio es realmente sencilla y se muestra a continuación:
package cu.uci.cdae.ws.client;

import javax.xml.ws.WebServiceRef;


public class clientews {
    @WebServiceRef(wsdlLocation = "wsdl/helloPersonService.wsdl")

    public static void main(String[] args) {
        try {

            HelloPersonService fg = new HelloPersonService();
            HelloPersonServicePortType port = fg.getHelloPersonServicePort();
   
      /* Esto se usa cuando el endpoint del WSDL no es el mismo que el del servicio real,ENDPOINT es un String que contiene el endpoint real
   ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT);
   */
   
            HelloPersonServiceRequestType request = new HelloPersonServiceRequestType();
            PersonType persona = new PersonType();

            long inicio = System.currentTimeMillis();
            persona.setFirstName("Jorge");
            persona.setLastName("Infante Osorio");
            request.setPerson(persona);

            HelloPersonServiceResponseType response = port.greetPerson(request);

            System.out.println(response.getGreetings());
            System.out.println("La demora es de: " + (System.currentTimeMillis() - inicio));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}


Y de esta manera ya tenemos un cliente funcional para consumir nuestro servicio web. Es bueno aclarar que como estamos usando maven podemos usar cualquier IDE siempre y cuando lo tengamos configurado apropiadamente para que nos resuelva las dependencias vía maven.

Espero les sea de utilidad.

0 comentarios:

Publicar un comentario