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.