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.

2 comentarios:

Ruli dijo...

Hola Emilio,
Tienes posteado ya el ejemplo completo con el cliente?
Me serviria de mucha ayuda ya que estoy haciendo un servicio web y lo quiero hacer con las mismas tecnologias.
Gracas

Emilio Escobar Reyero dijo...

Claro, lo tienes un par de post después.

http://emilio-escobar.blogspot.com/2010/07/disponible-el-codigo-fuente-del-ejemplo.html