23.1.06

Servicios Web con Spring y XFire

Bueno, este es mi primer artículo técnico, así que supongo que tendrá montones de errores y fallas de estilo. Sugerencias y correcciones bienvenidas.

Creando el Servidor


Lo primero es crear un DispatcherServlet con su correspondiente WebApplicationContext conteniendo los servicios que van a ser expuestos, en el fichero Web Pages/WEB-INF/web.xml de nuestro proyecto.
<servlet>
<servlet-name>xfire</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>

Ahora añadiremos un servlet-mapping (mapeando /* hacia el servlet XFire declarado arriba)


<servlet-mapping>
<servlet-name>xfire</servlet-name>
<url-pattern>/xfire/*</url-pattern>
</servlet-mapping>

Sólo nos quedará añadir un bean extra para exponer el servicio usando Xfire. Este bean será añadido en el fichero Web Pages/WEB-INF/xfire-servlet.xml:

<bean name="/Tempo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceBean" ref="data"/>
<property name="serviceInterface" value="es.usc.time.ITempo"/>
<property name="xfire" ref="xfire"/>
<property name="serviceFactory" ref="xfire.serviceFactory"/>
</bean>
Vemos la siguiente propiedad: <property name="serviceBean" ref="data"/>. Esta propiedad hace referencia a un bean declarado en Pages/WEB-INF/applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans public "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="...";
...
<bean id="data" class="es.usc.time.Tempo"/>
</beans>
En la clase es.usc.time.Tempo se procesará toda la información que debe tratar el WS.

XFire se ocupará del resto. Hará una introspección de la interfaz del servicio y generará el WSDL a partir de él. Para información más detallada acerca de la integración entre XFire y Spring echa un vistazo a docs.codehaus.org/display/XFIRE/Spring.

Este es el código fuente de nuestro servicio. Primero, la interfaz:

package
es.usc.time;
/** @author contremo */

public interface ITempo {
public String agora();
}
Esta interfaz es la que deberá ser referida en el archivo xfire-servlet.xml, en la propiedad "serviceInterface". Observa que se ha incluido el nombre completo, incluyendo la ruta dentro del paquete.

El siguiente archivo muestra nuestra clase principal, donde se va a procesar toda la información. Básicamente lo que hace es averiguar cual es la fecha y hora actuales y devolverlo en un String.


package es.usc.time;
import java.util.Date;
/**@author contremo */

public class Tempo implements ITempo{

/*constructor*/
public Tempo(){}

public String agora(){
return (new Date()).toString();
}

}
Si en lugar de un String quisiéramos enviar un tipo complejo, tendríamos que definirlo como un Bean. Recuerda que debe implementar la interfaz "Serializable", y recuerda también registrarlo en el cliente, o te verás en problemas.

Próximamente veremos como crear el cliente.

No hay comentarios: