Cliente de WebService CXF

En esta última entrega abordaré el cliente del webservice configurado en la entrega 1 y 2 Yo he realizado la prueba sobre un proyecto con struts2 y spring. Por lo que a nosotros respecta es lo de menos el haber utilizado struts2. Spring es en un standar de facto y a través de este framework es como estableceremos las llamadas al ws.

El primer paso será añadir el cliente jar que generamos con el ws en la entrega 2. Recuerdo que contiene la interfaz del ws y los "data" que se intercambian. Para ello dentro del pom añadimos la dependencia de ese jar:
        <dependency>
            <groupId>soy.guapo.home</groupId>
            <artifactId>firstcxf</artifactId>
            <version>1.0.0</version>
            <classifier>client</classifier>
        </dependency>
Como este proyecto utiliza Spring tenemos en el descriptor de despliege , el web.xml, la correspondiente referencia a los beans que debe instanciar Spring.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext*.xml</param-value>
    </context-param>

Como me gusta tener separadas las configuraciones voy a definir el cliente fuera del archivo applicationContext.xml, para ello añado en dicho archivo la entrada

<import resource="classpath:wslink.xml" />

En el archivo "wslink.xml" tendré única y exclusivamente la configuración del ws, dejando en el applicationContext.xml la configuración del resto de beans de spring, En mi caso y principalmente la configuración de los bean con los action de struts2.
El contenido de dicho archivo será:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:simple="http://cxf.apache.org/simple"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd
       http://cxf.apache.org/transports/http/configuration 
       http://cxf.apache.org/schemas/configuration/http-conf.xsd">

    <simple:client id="calculadora"
        serviceClass="soy.guapo.home.ws.pub.HelloWorld"
        address="http://192.168.2.52:7777/firstcxf/HelloWorld">
    </simple:client>


</beans>


 Esto me instancia un bean con identificador "calculadora" que se puede inyectar por Spring en donde haga falta. No tiene más misterio que configurar en serviceClass el interfaz y en address el endpoint.

En mi caso le inyectado este bean a un action con el siguiente código en el applicationContext.xml.

     <bean id="calculator" class="es.home.action.CalculatorAction" scope="prototype">
        <property name="calculadoraWS" ref="calculadora" />
    </bean>

En mi caso el código del action no tiene misterio alguno, pongo un trozo de código:

// los bean utilizamos como parámetros
import soy.guapo.home.ws.data.ParamDivide;
import soy.guapo.home.ws.data.ParamMultiplica;
import soy.guapo.home.ws.data.ParamResta;
import soy.guapo.home.ws.data.ParamSuma;

// el interfaz del ws
import soy.guapo.home.ws.pub.HelloWorld;

import com.opensymphony.xwork2.ActionSupport;

public class CalculatorAction extends ActionSupport {

    private static final long serialVersionUID = 5L;

    private int numA;
    private int numB;
    private int resultado;

    private HelloWorld calculadoraWS;

    public String execute() {
        LOG.debug("Entramos en la calculadora ");
        return INPUT;
    }

    public String resta() {
        LOG.info("Resta");
        ParamResta paramResta = new ParamResta();
        paramResta.setNumA(numA);
        paramResta.setNumB(numB);
        resultado = calculadoraWS.resta(paramResta);
        return SUCCESS;
    }

    public String suma() {
        LOG.info("Suma");
        ParamSuma paramSuma = new ParamSuma();
        paramSuma.setNumA(numA);
        paramSuma.setNumB(numB);
        resultado = calculadoraWS.suma(paramSuma);
        return SUCCESS;
    }
.....
    public void setCalculadoraWS(HelloWorld calculadoraWS) {
        this.calculadoraWS = calculadoraWS;
    }

    public HelloWorld getCalculadoraWS() {
        return calculadoraWS;
    }

Como se puede observar, para el action , como para cualquier clase a la cual se le inyecte, que sea un ws o una clase de utilidad interna es transparente. Es en la configuración de Spring donde se indica que calculadoraWS es el bean identificado como "calculadora" y que este es un webservice.








Comentarios