Blog de Antonio Manuel Muñiz

Desarrollo, Ingeniería y Calidad del Software

Spring beans como Web Services con WSO2 Framework

Hace algún tiempo hablaba de WSO2 y su gran iniciativa en el mundo de los servicios web. He estado probando Web Services Framework for Spring y la verdad es que han conseguido que la árdua tarea de integrar un servicio web basado en Apache Axis2 con Spring sea cuestión de minutos.

Para ilustrar el proceso configuraremos una aplicación web basada en Spring para que exponga uno de sus beans como un servicio web.

La estructura de nuestra aplicación será la siguiente:

+META-INF
+WEB-INF
   + lib
   - applicationContext.xml
   - dispatcher-servlet.xml
   - axis2Config.xml
   - web.xml
+axis2-web
-index.jsp

En WEB-INF/lib debemos copiar el directorio /lib distribuido con el framework. Sería posible evitar esto si nuestro proyecto esta modelado con maven, aprovechando que WSF-Spring también es un proyecto Maven 2, para esto habría que estudiar más a fondo la estructura de WSF-Spring e integrarlo como un módulo de nuestro proyecto.

También debemos copiar el fichero axis2Config.xml a nuestro WEB-INF, y por último copiar el directorio axis2-web (incluido en la distribución) a la raíz de nuestro proyecto.

El bean que expondremos como un servicio será el siguiente:

package sample.spring.axis;
public class Sample {

    private int offset;

    public int add(int i, int j){
        return offset + i + j;
    }

    public void setOffset(int value){
        this.offset = value;
    }
}

Se ha incluido el atributo offset para comprobar como se comporta el servicio manteniendo un estado interno representado mediante esta variable.

El siguiente paso es la inicialización del bean en el contexto de la aplicación (applicationContext.xml):

<bean id="addBean" class="sample.spring.axis.Sample">
    <property name="offset" value="0" />
</bean>

En principio el valor de offset será 0 y la configuración necesaria para mostrar el bean como un servicio será:

<bean id="services" class="org.wso2.spring.ws.WebServices">
    <property name="services">
        <list>
            <bean id="helloService" class="org.wso2.spring.ws.SpringWebService">
                <property name="serviceBean" ref="addBean" />
                <property name="serviceName" value="addBeanService" />
            </bean>
        </list>
    </property>
</bean>

Importar el fichero axis2Config.xml en el applicationContext.xml:

<import resource="axis2Config.xml"/>

En el fichero web.xml de nuestra aplicación incluiremos:

<servlet>
    <servlet-name>axis2</servlet-name>
    <servlet-class>org.wso2.spring.ws.servlet.SpringAxis2Servlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>axis2</servlet-name>
    <url-pattern>/axis2/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>axis2</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>

Y nada más. Esta es toda la configuración necesaria, si empaquetamos la aplicación web en un WAR y la desplegamos en un servidor de aplicaciones podemos comprobar que el servicio se esta exponiendo correctamente accediendo a http://<dirección_ip&gt;:<puerto>/<contexto>/services/addBeanService?wsdl

Yo lo he desplegado en un servidor Glassfish (donde también tengo una instancia de Hudson ;) dicho sea de paso):

El WSDL se muestra en la URL indicada:

Para probar que el servicio funciona correctamente haremos una petición con SoapUI:

Se puede observar que el servicio generado por WSF-Spring muestra como operaciones todos los métodos públicos del bean, en este caso add y setOffset. Mediante una llamada a setOffset modificaremos la propiedad offset del bean (simulación de estado):

Si volvemos a realizar la llamada a la operación add con los parámetros 2, 3 por ejemplo comprobamos que efectivamente es posible modificar el estado del bean expuesto como servicio.

11 Respuestas a “Spring beans como Web Services con WSO2 Framework

  1. LiN 17 julio 2008 en 12:59 pm

    Hola Antonio,

    Muchas gracias por el trabajo. La verdad es que el grado de simplicidad es asombroso.

    Un par de dudas:
    – ¿Es posible configurar qué métodos del bean serán expuestos como operaciones en la interfaz de WS? Te lo comento porque algunos métodos set que se utilizan con los POJOs quizás no interesen exponerlos, ya que sólo los utiliza el contenedor IoC.

    – ¿Qué hay de temas de autenticación y autorización (a nivel de operaciones del servicio web, que no serían más que métodos de un bean)? ¿También hay integración con Acegi?

  2. amunizmartin 17 julio 2008 en 4:08 pm

    Pues en principio las operaciones que se expondrán se corresponderán con todos los métodos públicos del bean, si se necesita que un método no se exponga hay declararlo privado.

    En cuanto a la autenticación y autorización entiendo que basta con exponer un bean con las operaciones adecuadas, y dependiendo del tipo de autorización que se use habrá más o menos inconvenientes, habría que estudiar cómo gestiona WSF-Spring la implementación WS-Security que ofrece Axis2. En cuanto al mantenimiento del estado (en este caso, la sesión autenticada) no habrá problema, como muestra en ejemplo con “offSet”.

    Integración con Acegi, la que da Spring teniendo en cuenta que los métodos serán llamados como operaciones.

  3. Manuel Jesús Recena Soto 24 julio 2008 en 4:00 pm

    Hola Antonio:

    El trabajo de WSO2 es realmente bueno, además también para PHP:
    http://wso2.org/projects/wsf/php

    Un saludo

  4. amunizmartin 28 julio 2008 en 12:43 am

    Pues si. Y el framework para PHP no es lo único, hace poco probé su servidor de aplicaciones:
    http://wso2.org/projects/wsas/java

    Y tengo en la cola probar su implementación de ESB basada en ServiceMix:
    http://wso2.org/projects/esb/java

    Un saludo.

  5. Manuel Loayza 22 noviembre 2008 en 3:34 pm

    Hola.

    Es realmente asombroso el trabajo de WSO2. Me hubiese gustado que su ESB se basase en Service Mix y no en Synapse ESB, pues segun comentarios en la Web el Service Mix es la mejor implementacion open source de un ESB. Y si vemos el Fuse que es otro ESB basado en Service Mix, el cual usa a Camel, ActiveQM y CFX como framework para el desarrollo de WS, se ve como un desarrollo muy ambicioso.

    Saludos.

  6. Antonio Manuel Muñiz Martín 24 noviembre 2008 en 1:56 am

    Hola Manuel.

    El único bus que he tocado (a un nivel suficiente como para emitir un juicio) es openESB. Además de la gestión del bus que ofrece el servidor de aplicaciones en el que va empotrado (glassfish), su integración con NetBeans es muy muy alta. Esto facilita mucho el desarrollo de módulos para este bus, no se como estará este tema en Synapse o ServiceMix.

    Un saludo.

  7. Andry 28 noviembre 2011 en 9:08 pm

    quizá esto sea una ingenuidad, pero a la verdad soy nuevo en esto de WSO2 con Spring, cuando descargo el wsf-spring 1.5 no tiene el archivo “axis2Config.xml”. Veo que es sencillo tu tutorial y está muy bueno, pero sin ese archivo no puedo hacer nada. Agradecería su ayuda.
    Gracias de antemano

  8. Antonio Manuel Muñiz Martín 28 noviembre 2011 en 9:28 pm

    Hola Andry,

    Es probable que hayan cambiado algunas cosas en el módulo de integración, como puedes ver la entrada es de 2008. No conozco la versión 1.5 de WSF for Spring. Siento no poder ayudarte.

    Un saludo.

  9. Alain 7 mayo 2012 en 7:23 pm

    hola alguno de ustedes a montado algun servicio con wsf php y symfony2

    saludos y gracias

  10. Alain 7 mayo 2012 en 7:29 pm

    como puedo integrar wsf php a algun proyecto de forma que desde el IDE me complete las funciones propias del framework, es decir que las reconosca

    saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: