miércoles, 30 de junio de 2010

Servicios Web con Apache CXF / Spring / Maven (Servidor)

Desde hace unos meses vengo trabajando con servicios web y la verdad es que cada vez es más sencillo. Para montarlos usamos, Java 6, Maven 2.2.1, Spring Framework, Apache CXF, JAX-WS y JAXB.

El proyecto maven

Me voy a decantar en este momento por un proyecto multimódulo que contenga,

svc-api, con las interfaces del servicio y los dto.
svc-server, con la implementación del servicio.
svc-ws, módulo de tipo war con la declaración del servicio.

¿Por qué lo organizo así? Pues porque me aporta gran facilidad a la hora de desplegar el servidor y el cliente, sin más.

La interfaz del servicio

Un ejemplo simple de un servicio web que tiene una única operación que recibe un dto y devuelve una lista de cadenas es, para uno de los dto implicados,

 package emilio.escobar.api;

import java.io.Serializable;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="entrada")
public class EntradaDTO implements Serializable {
private static final long serialVersionUID = -1266514434540369282L;
private String nombre;
private List parametros;

@XmlElement(name="nombre")
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@XmlElement( name="parametro" )
@XmlElementWrapper( name="parametros" )
public List getParametros() {
return parametros;
}
public void setParametros(List parametros) {
this.parametros = parametros;
}
}

la interfaz,

 package emilio.escobar.api;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;

@WebService
@XmlSeeAlso({EntradaDTO.class, ParametroDTO.class})
public interface Servicio {
@WebResult(name = "resultados")
List operacion(@WebParam(name = "entrada") EntradaDTO entrada);
}


y la implementación,

 package emilio.escobar.impl;

import java.util.List;
...

public class ServicioImpl implements Servicio {
List operacion(EntradaDTO entrada) {
...
}
}


Los ficheros de configuración

Como usamos Spring Framework y Apache CXF la configuración del servidor la hacemos en dos líneas,

 <id="servicioImpl" class="emilio.escobar.impl.ServicioImpl" />    <id="servicioWS" implementor="#servicioImpl" address="/Servicio" />  
En próximos post continuaré construyendo el ejemplo completo y adjuntaré todos los ficheros necesarios para probarlo.

Quedan pendientes cómo construir el cliente, cómo probarlo, cómo añadir elementos a la cabecera SOAP, y cómo usarlos desde GWT.

viernes, 4 de junio de 2010

GeNews estrena web

Ha pasado algo de tiempo pero la espera ha merecido la pena, GeNews estrena web. Desde un punto de vista práctico recomiendo una pasada por el vídeo donde se describen sus características principales.

GeNews es un desarrollo de la empresa andaluza Isotrol.

Por último, recordaros que existe un grupo en linkedIn y un canal en Vimeo.