Avenida de Castilla,1 - Edificio Best Point - Oficina 21B
28830 San Fernando de Henares (Madrid)
tel./fax: +34 91 675 33 06
[email protected] - www.autentia.com
Somos su empresa de Soporte a Desarrollo Informático.
Ese apoyo que siempre quiso tener...
1. Desarrollo de componentes y
proyectos a medida
Tecnología Desarrollo SistemasGran Empresa
Producción
autentia Certificación o Pruebas Verificación previaRFP
Concurso
Consultora 1
Consultora 2
Consultora 3
Equipo propio desarrollo
Piloto3a
3b
1. Definición de frameworks corporativos.
2. Transferencia de conocimiento de nuevas arquitecturas.
3. Soporte al arranque de proyectos.
4. Auditoría preventiva periódica de calidad.
5. Revisión previa a la certificación de proyectos.
6. Extensión de capacidad de equipos de calidad.
7. Identificación de problemas en producción.
3. Arranque de proyectos basados en nuevas
tecnologías
¿Qué ofrece Autentia Real
Business Solutions S.L?
Para más información visítenos en:
www.autentia.com
Compartimos nuestro conociemiento en:
www.adictosaltrabajo.com
Gestor portales (Liferay)
Gestor de contenidos (Alfresco)
Aplicaciones híbridas
Tareas programadas (Quartz)
Gestor documental (Alfresco)
Inversión de control (Spring)
BPM (jBPM o Bonita)
Generación de informes (JasperReport)
ESB (Open ESB)
Control de autenticación y
acceso (Spring Security)
UDDI
Web Services
Rest Services
Social SSO
SSO (Cas)
Spring MVC, JSF-PrimeFaces /RichFaces,
HTML5, CSS3, JavaScript-jQuery
JPA-Hibernate, MyBatis
Motor de búsqueda empresarial (Solr)
ETL (Talend)
Dirección de Proyectos Informáticos.
Metodologías ágiles
Patrones de diseño
TDD
2. Auditoría de código y recomendaciones de mejora
Inicio Quienes somos Tutoriales Formación Colabora Comunidad Comic Charlas
Más
Catálogo de
servicios
Autentia (
6,2MB)
En formato comic... Web www.adictosaltrabajo.comÚltimos tutoriales
2009-02-26 Spring WS: Creación de Servicios Web con Spring 2009-03-13 Instalación Alfresco (Labs) 2009-02-26 Maven JXR Plugin: publica el código fuente en el site 2009-02-26 Generación de XML Schema (XSD) y DTD a partir de documentos XML 2009-03-04Persistencia con Spring
2009-02-26 Vistas materializadas 2009-02-03 Instalación de MySQL 5.1 en Windows 2009-03-03 Instalación de Java Virtual Machine 2009-03-03 Primeros Pasos con Liferay 5.2.1
2009-02-27
Edicion de video MPEG2
Últimas ofertas
Tutorial desarrollado por
Carlos
García
Pérez
Creador de MobileTest,
un complemento
educativo para los profesores y sus alumnos. Consultor tecnológico en el desarrollo de proyectos informáticos. Ingeniero Técnico en Informática *
Puedes encontrarme en Autentia Somos expertos en Java/J2EE
Catálogo de servicios de
Autentia
Descargar (6,2 MB)
Descargar en versión comic (17 MB)
AdictosAlTrabajo.com es el Web de difusión de conocimiento de Autentia.
Catálogo de cursos
NUEVO
¿Quieres saber cuánto ganas en relación
al mercado? pincha
aquí...
Ver cursos que ofrece Autentia Descargar comics en PDF y alta resolución
[¡NUEVO!] 2008-12-01 2008-11-17
2008-09-01
2008-07-31 Estamos escribiendo un libro sobre la profesión informática y estas viñetas formarán parte de él. Puedes
opinar en la seccion comic.
Descargar este documento en formato PDF: springwsexample1.pdf
Fecha de creación del tutorial: 2009-02-26
Spring WS: Creación de Servicios Web con
Spring
En el siguiente tutorial vamos a ver algunas de las aportaciones que nos ofrece Spring en relación a la construcción de Servicios Web.
Se presupone que el lector ya posee conocimientos de Servicios Web, Maven y Spring.
Indice de contenido:
Introducción. 1.
Ejemplo de construcción de un Servicio Web con Spring.
Entorno. 1.
Estructura del proyecto. 2.
Describiendo la petición al servicio web.
3.
Describiendo la respuesta del servicio web. 4.
Código fuente de las clases que componen el servicio Web. 5.
Archivo de configuración de Log4J: /WEB-ING/log4j.xml. 6.
Archivo de configuración de Spring 2 (\WEB-INF\bibliotecaWS-servlet.xml). 7.
Archivo de configuración y despliegue de la aplicación (/WEB-INF/web.xml). 8.
Archivo de configuración de Maven 2: pom.xml. 9.
Construcción y despliegue la aplicación. 10.
2.
Ejemplo de construcción de un cliente (Axis2) para probar el servicio web.
3. Referencias 4. Conclusiones 5.
Introducción
de empleo
2009-03-12 Comercial Ventas -VALENCIA. 2009-03-12 Comercial Ventas -SEVILLA. 2009-02-21 Otras Estética/Peluquería -MADRID. 2009-02-13 T. Información - Otros no catalogados -MADRID. 2009-02-13 T. Información - Otros no catalogados -MADRID. Todos estaremos de acuerdo en que las aplicaciones actuales no están aisladas, que hay necesidad (ydeben) interoperar para resolver los problemas, es más, incluso aunque ahora no sea necesario, se debe diseñar una solución para que en caso de necesidad el impacto sea mínimo.
Un problema debería ser resuelto una vez y ser reutilizado por el resto de sistemas (con independencia de lenguajes de programación y arquitecturas) sin tener que volver que resolver el mismo problema
implementando una y otra vez lo mismo en cada nueva aplicación.... (SOA).
En este tutorial vamos a ver un ejemplo de construcción de un servicio web usando el modelo contrato primero (Spring apuesta por este modelo). Desde mi punto de vista la mejor forma de implementar un servicio Web, cuando de verdad se desea interoperabilidad... no quiero entrar en este tema si os interesa, podéis leer la siguientes webs que explican por que es mejor el modelo contrato primero frente a partir de una interfaz de programación:
http://static.springframework.org/spring-ws/sites/1.5/reference/html/why-contract-first.html.
http://tssblog.blogs.techtarget.com/contract-first-or-code-first-design-part-1.
Para terminar la introducción decir que Spring también tiene mucho que aportar en relación a otras técnicas de comunicación remota: RMI, Hessian y Burlap, HTTPInvoker. Pero se salen del ámbito de este tutorial.
Ejemplo de construcción de un Servicio Web con Spring:
A continuación vamos a ver un completo ejemplo en donde construiremos un Servicio Web que representa al motor de búsqueda de libros de una biblioteca. Las aplicaciones preguntarán sobre libros de una determinada categoría y nivel y el servicio devolverá aquellos libros disponibles que cumplen esos criterios de búsqueda.
El código fuente de este tutorial puede ser descargado desde aquí (proyecto Eclipse con Maven 2).
Entorno
El siguiente ejemplo está construido en el siguiente entorno: HP Pavilion.
Windows Vista Home Premium. Eclipse Ganymede.
Java 6. Maven 2.
Plugin Maven 4QE para Eclipse.
Estructura del proyecto:
Una de las muchas ventajas de Maven es que estandariza la estructura de los proyectos, es decir, cualquier persona con conocimientos de Maven tendría facilidad de comprender como se estructura y dónde está cada cosa dentro del proyecto.
Si nos fijamos hay un arquetipo Maven 2 para proyectos Spring WS:
http://www.mavenrepository.com/artifact /org.springframework.ws/spring-ws-archetype Yo cree el proyecto con el comando:
mvn archetype:create -DarchetypeGroupId=org.springframework.ws -DarchetypeArtifactId=spring-ws-archetype -DarchetypeVersion=1.5.6 -DgroupId=com.autentia.tutoriales -DartifactId=bibliotecaWS
Vosotros como ya lo tenéis hecho, simplemente tendréis que importarlo desde vuestro IDE favorito. Yo uso Eclipse Ganymede con el plugin Q4E para gestión de proyectos Maven.
Describiendo la petición al servicio web: booksInfoRequest.xml
¿Cómo nos gustaría que fueran los mensajes de solicitud o consulta de libros?... pues, por ejemplo así:
Ads by Google View ads about:
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01.
<BooksInfoRequest xmlns="http://www.adictosaltrabajo.com/spring/ws/schemas">
02.
<categoria>Servicios Web</categoria>
03.
<nivel>avanzado</nivel>
04.
</BooksInfoRequest>
05.
Una categoría y un nivel, en donde el nivel está restringido a ser: básico o medio o avanzado Ahora lo definimos con un XML Schema: booksInfoRequest.xsd
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 02. elementFormDefault="qualified" 03. targetNamespace="http://www.adictosaltrabajo.com/spring/ws/schemas" 04. xmlns:schemas="http://www.adictosaltrabajo.com/spring/ws/schemas"> 05. 06.
<xsd:element name="BooksInfoRequest">
07.
<xsd:complexType>
08.
<xsd:sequence>
09.
<xsd:element name="categoria" type="xsd:string" />
10.
<xsd:element name="nivel" type="schemas:nivelType"/>
11. </xsd:sequence> 12. </xsd:complexType> 13. </xsd:element> 14. 15.
<xsd:simpleType name="nivelType">
16.
<xsd:restriction base="xsd:string">
17.
<xsd:enumeration value="basico" />
18.
<xsd:enumeration value="medio" />
19.
<xsd:enumeration value="avanzado" />
20. </xsd:restriction> 21. </xsd:simpleType> 22. </xsd:schema> 23.
¿Qué nó sabes hacerlo o no te apetece?, pues mira esté tutorial: Ver tutorial.
Describiendo la respuesta del servicio web: booksInfoResponse.xml
¿Cómo nos gustaría que fueran los mensajes de respuesta?... pues, por ejemplo así (con N libros):
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01.
<BooksInfoResponse xmlns="http://www.adictosaltrabajo.com/spring/ws/schemas">
02.
<libro>
03.
<editorial>Editorial Guay</editorial>
04.
<titulo>Java en ejemplos</titulo>
05. <paginas>520</paginas> 06. <precio>40</precio> 07. </libro> 08. <libro> 09.
<editorial>Editorial XYZ</editorial>
10.
<titulo>Aprenda Java en 50 dias</titulo>
11. <paginas>700</paginas> 12. <precio>80</precio> 13. </libro> 14. </BooksInfoResponse> 15.
N libros en donde cada uno está definido por una editorial, un título (ambos texto libre), un número de páginas y un precio (ambos números positivos).
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 02. elementFormDefault="qualified" 03. targetNamespace="http://www.adictosaltrabajo.com/spring/ws/schemas" 04. xmlns:schemas="http://www.adictosaltrabajo.com/spring/ws/schemas"> 05. 06.
<xsd:element name="BooksInfoResponse">
07.
<xsd:complexType>
08.
<xsd:sequence>
09.
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="schemas:libro"/>
10. </xsd:sequence> 11. </xsd:complexType> 12. </xsd:element> 13. 14.
<xsd:element name="libro">
15.
<xsd:complexType>
16.
<xsd:sequence>
17.
<xsd:element name="editorial" type="xsd:string"/>
18.
<xsd:element name="titulo" type="xsd:string"/>
19.
<xsd:element name="paginas" type="xsd:positiveInteger"/>
20.
<xsd:element name="precio" type="xsd:positiveInteger"/>
21. </xsd:sequence> 22. </xsd:complexType> 23. </xsd:element> 24. </xsd:schema> 25.
Definir el Web Service: /WEB-INF/bibliotecaWS.xsd
Sencillo, unimos los XML Schema anteriores y el resto lo configuramos en Spring. Es decir, se podría decir que en conjunto es como el WSDL del servicio Web, es más, de hecho se generará automáticamente.
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 02. elementFormDefault="qualified" 03. targetNamespace="http://www.adictosaltrabajo.com/spring/ws/schemas" 04. xmlns:schemas="http://www.adictosaltrabajo.com/spring/ws/schemas"> 05. 06.
<xsd:element name="BooksInfoRequest">
07.
<xsd:complexType>
08.
<xsd:sequence>
09.
<xsd:element name="categoria" type="xsd:string" />
10.
<xsd:element name="nivel" type="schemas:nivelType"/>
11. </xsd:sequence> 12. </xsd:complexType> 13. </xsd:element> 14. 15.
<xsd:simpleType name="nivelType">
16.
<xsd:restriction base="xsd:string">
17.
<xsd:enumeration value="basico" />
18.
<xsd:enumeration value="medio" />
19.
<xsd:enumeration value="avanzado" />
20. </xsd:restriction> 21. </xsd:simpleType> 22. 23.
<xsd:element name="BooksInfoResponse">
24.
<xsd:complexType>
25.
<xsd:sequence>
26.
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="schemas:libro"/>
27. </xsd:sequence> 28. </xsd:complexType> 29. </xsd:element> 30. 31.
<xsd:element name="libro">
32.
<xsd:complexType>
33.
<xsd:sequence>
34.
<xsd:element name="editorial" type="xsd:string"/>
35.
<xsd:element name="titulo" type="xsd:string"/>
36.
<xsd:element name="paginas" type="xsd:positiveInteger"/>
37.
<xsd:element name="precio" type="xsd:positiveInteger"/>
38. </xsd:sequence> 39. </xsd:complexType> 40. </xsd:element> 41. </xsd:schema> 42.
A continuación iremos viendo las clases que componen el proyecto.
NOTA: Lo voy a hacer a mano, pero las clases Libro, BookInfoRequest y BookInfoResponse podrían de muchas formas ser generadas automáticamente desde los XSD. Por ejemplo, en el siguiente enlace http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=xmlBeans mi compañero Alejandro García os explica una de ellas.
com.autentia.tutoriales.spring.ws.entity.Libro:
view plain print ?package com.autentia.tutoriales.spring.ws.entity; 01. 02.
/**
03.* Representación de un libro
04.* @author Carlos García. Autentia
05.* @see http://www.mobiletest.es
06.*/
07.
public class Libro {
08.
private String editorial;
09.
private String titulo;
10.
private int paginas;
11.
private int precio;
12.
13.
public String getEditorial() {
14.
return editorial;
15.
}
16.
public void setEditorial(String editorial) {
17.
this.editorial = editorial;
18.
}
19.
public String getTitulo() {
20.
return titulo;
21.
}
22.
public void setTitulo(String titulo) {
23.
this.titulo = titulo;
24.
}
25.
public int getPaginas() {
26.
return paginas;
27.
}
28.
public void setPaginas(int paginas) {
29.
this.paginas = paginas;
30.
}
31.
public int getPrecio() {
32.
return precio;
33.
}
34.
public void setPrecio(int precio) {
35.
this.precio = precio;
36. } 37. } 38.
com.autentia.tutoriales.spring.ws.entity.BooksInfoRequest:
view plain print ?package com.autentia.tutoriales.spring.ws.entity; 01. 02.
/**
03.* Representación de una petición.
04.* @author Carlos García. Autentia
05.* @see http://www.mobiletest.es
06.*/
07.
public class BooksInfoRequest {
08.
private String categoria;
09.
private String nivel;
10.
11.
public String getCategoria() {
12.
return categoria;
13.
}
14.
public void setCategoria(String categoria) {
15.
this.categoria = categoria;
16.
}
17.
public String getNivel() {
18.
return nivel;
19.
}
20.
public void setNivel(String nivel) {
21.
this.nivel = nivel;
22. } 23. } 24.
com.autentia.tutoriales.spring.ws.entity.BooksInfoResponse:
view plain print ? package com.autentia.tutoriales.spring.ws.entity; 01. 02.
/**
03.* Representación la respuesta a una petición BooksInforRequest.
04.* @author Carlos García. Autentia
05.* @see http://www.mobiletest.es
06.*/
07.
public class BooksInfoResponse {
08.
private java.util.ArrayList<Libro> libros;
09.
10.
public BooksInfoResponse(){
11.
this.libros = new java.util.ArrayList<Libro>();
12.
}
13.
14.
public void addLibro(Libro libro){
15. this.libros.add(libro); 16. } 17. 18.
public java.util.List<Libro> getLibros() {
19.
return this.libros;
20. } 21. } 22.
com.autentia.tutoriales.spring.ws.IRequestProcessor:
Cuando el servicio web reciba una petición, la lógica de negorio real de tratamiento de la misma será realizada por alguna clase que implemente esta interfaz.
view plain print ?
package com.autentia.tutoriales.spring.ws; 01. 02. import com.autentia.tutoriales.spring.ws.entity.BooksInfoRequest; 03. import com.autentia.tutoriales.spring.ws.entity.BooksInfoResponse; 04. 05.
/**
06.* Tratamiento de una petición de búsqueda de libros
07.* @author Carlos García. Autentia.
08.* @see http://www.mobiletest.es
09.*/
10.
public interface IRequestProcessor {
11.
/**
12.* Procesa la petición de consulta
13.* @param request Datos de la consulta
14.* @return Devuelve la respuesta
15.*/
16.
public BooksInfoResponse process(BooksInfoRequest request);
17.
}
18.
com.autentia.tutoriales.spring.ws.DummyRequestProcessor:
Implementación sencilla de la interfaz IRequestProcessor para este este ejemplo.view plain print ? package com.autentia.tutoriales.spring.ws; 01. 02. import com.autentia.tutoriales.spring.ws.entity.BooksInfoRequest; 03. import com.autentia.tutoriales.spring.ws.entity.BooksInfoResponse; 04. import com.autentia.tutoriales.spring.ws.entity.Libro; 05. 06.
/**
07.* Implementación dummy de IRequestProcesor
08.* @author Carlos García. Autentia.
09.* @see http://www.mobiletest.es
10.*/
11.
public class DummyRequestProcessor implements IRequestProcessor {
12. 13.
/*
14.* @see com.autentia.tutoriales.spring.ws.IRequestProcessor#process(com.autentia.
15.*/
16.public BooksInfoResponse process(BooksInfoRequest request) {
17.
BooksInfoResponse response = new BooksInfoResponse();
18.
Libro libro = null;
19.
20.
for (int i = 0; i < 5; i++){
21.
libro = new Libro();
22.
23.
libro.setTitulo("Titulo libro " + i);
24.
libro.setEditorial("Editorial libro " + i);
25. libro.setPaginas(100 + i); 26. libro.setPrecio(50 + i); 27. 28. response.addLibro(libro); 29. } 30. 31. return response; 32. } 33. } 34.
com.autentia.tutoriales.spring.ws.BookInfoEndPoint:
EndPoint del WS, recibe las peticiones de consulta de libros (peticiones XML), las convierte en objetos y delega su procesamiento a un IRequestProcessor.
Yo he elegido hacerlo con DOM (mensajes completos en memoria...), pero hay otras muchas implementaciones que nos permiten implementarlo con Stax, SAX, JDOM...
view plain print ? package com.autentia.tutoriales.spring.ws; 01. 02. import java.util.Iterator; 03. import java.util.List; 04. import org.w3c.dom.Document; 05. import org.w3c.dom.Element; 06. import org.w3c.dom.Text; 07. import org.apache.commons.logging.Log; 08. import org.apache.commons.logging.LogFactory; 09. import org.springframework.ws.server.endpoint.AbstractDomPayloadEndpoint; 10. import com.autentia.tutoriales.spring.ws.entity.*; 11. 12.
/**
13.* EndPoint del WS, recibe las peticiones de consulta de libros (peticiones XML),
14.* las convierte en objetos y delega su procesamiento a un IRequestProcessor.
15.* @author Carlos García. Autentia
16.* @see http://www.mobiletest.es
17.*/
18.
public class BookInfoEndPoint extends AbstractDomPayloadEndpoint {
19.
private Log logger = LogFactory.getLog(BookInfoEndPoint.class);
20.
21.
private IRequestProcessor procesor;
22.
23.
/**
24.* Será inyectado por Spring
25.*/
26.
public void setProcesor(IRequestProcessor procesor) {
27.
this.procesor = procesor;
28. 29. } 30. 31.
/*
32.* @see org.springframework.ws.server.endpoint.AbstractDomPayloadEndpoint#invokeI
33.*/
34.protected Element invokeInternal(Element domRequest, Document document) throws Exception {
35.
if (logger.isDebugEnabled()){
36.
logger.debug("Petición de consulta de libros");
37.
}
38.
39.
BooksInfoRequest request = this.xmlToInfoRequest(domRequest);
40.
41.
if (logger.isDebugEnabled()){
42.
logger.debug("PETICION: categoria=" + request.getCategoria() + ", nivel="
43.
}
44.
45.
BooksInfoResponse response = procesor.process(request);
46. 47. if (logger.isDebugEnabled()){ 48. int numLibros = 0; 49. if (response.getLibros() != null){ 50. numLibros = response.getLibros().size(); 51. } 52.
logger.debug("RESPUESTA: Número de libros: " + numLibros);
53.
}
54.
55.
Element domResponse = this.responseToXml(response, document);
56. 57. return domResponse; 58. } 59. 60.
/**
61.* @param request Elemento XML <BooksInfoRequest ...>
62.* @return Genera una instancia de BooksInfoRequest a partir de un elemento xml
63.*/
64.
private BooksInfoRequest xmlToInfoRequest(Element request){
65.
String categoria = request.getElementsByTagName("categoria").item(0).getFirstChild().getNodeValue();
66.
String nivel = request.getElementsByTagName("nivel").item(0).getFirstChild().getNodeValue();
67.
68.
BooksInfoRequest bookInfoRequest = new BooksInfoRequest();
69. 70. bookInfoRequest.setCategoria(categoria); 71. bookInfoRequest.setNivel(nivel); 72. 73. return bookInfoRequest; 74. } 75. 76.
/**
77.* @param request Elemento XML <BooksInfoRequest ...>
78.* @return Genera una instancia de BooksInfoRequest a partir de un elemento xml
79.Archivo de configuración de Log4J: /WEB-ING/log4j.xml:
A continuación exponemos el archivo de configuración de Log4J. Los mensajes con nivel WARN o superior irán a parar a un archivo y el resto (de cualquier nivel DEBUG, INFO, etc.) a otro.
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01.
<!DOCTYPE log4j:configuration SYSTEM "dtds/log4j.dtd">
02.
<log4j:configuration xmlns:log4j="http://jakarta.apache.org /log4j/" debug="false">
03.
04.
<!‐‐ Los errores irán a parar al siguiente archivo: ‐‐>
05.
<appender name="error_file" class="org.apache.log4j.RollingFileAppender">
06.
<param name="File" value="bibliotecaWS_error.log" />
07.
<param name="MaxFileSize" value="2000000" />
08.
<param name="MaxBackupIndex" value="5" />
09.
<param name="Threshold" value="WARN" />
10.
11.
<layout class="org.apache.log4j.PatternLayout">
12.
<param name="ConversionPattern"
13. value="%n%d{yyyy‐MM‐dd HH:mm:ss} [%‐5p] [%l] %n%m%n" /> 14. </layout> 15. </appender> 16. 17.
<!‐‐ Todas las trazas (debug, warn, error, etc.) irán a parar a este archivo: ‐‐> 18.
<appender name="debug_file" class="org.apache.log4j.RollingFileAppender">
19.
<param name="File" value="bibliotecaWS_debug.log" />
20.
<param name="MaxFileSize" value="5000000" />
21.
<param name="MaxBackupIndex" value="5" />
22.
23.
<layout class="org.apache.log4j.PatternLayout">
24.
<param name="ConversionPattern"
25. value="%n%d{yyyy‐MM‐dd HH:mm:ss} [%‐5p] [%l] %n%m%n" /> 26. </layout> 27. </appender> 28. 29.
<!‐‐ Habilitamos sólo los logs de nivel warning o superior para toda la aplicación ‐‐ 30.
<root>
31.
<level value="warn" />
32.
<appender‐ref ref="error_file" />
33.
</root>
34.
35.
<!‐‐ Habilitamos todos los LOGS de todas las clases del paquete com.autentia.tutorial 36.
<category name="com.autentia.tutoriales.spring.ws">
37.
<priority value="debug" />
38.
<appender‐ref ref="debug_file" />
39.
</category>
40.
</log4j:configuration>
41.
Archivo de configuración de Spring 2 (\WEB-INF\bibliotecaWS-servlet.xml):
Atención, el nombre del archivo es importante, debe ser igual que el nombre del servlet que verémos más adelante y luego "-servlet.xml".view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01. <beans xmlns="http://www.springframework.org/schema/beans" 02. xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" 03. xmlns:util="http://www.springframework.org/schema/util" 04. xsi:schemaLocation="http://www.springframework.org/schema /beans http://www.springframework.org/schema/beans/spring‐beans‐2.5.xsd 05. http://www.springframework.org /schema/util http://www.springframework.org/schema/util/spring‐util‐2.5.xsd"> 06. 07.
<!‐‐ Realiza la lógica de negocio de consulta de libros en base a la petición ‐‐> 08.
<bean name="requestProcesor" class="com.autentia.tutoriales.spring.ws.DummyRequestProcessor"
09.
10.
<!‐‐ EndPoint del WS: Recibirá la petición del WS (WSDL operation) ‐‐>
11.
<bean id="bibliotecaWSEndpoint" class="com.autentia.tutoriales.spring.ws.BookInfoEndPoint"
12.
<property name="procesor" ref="requestProcesor" />
13.
</bean>
14.
15.
<!‐‐ Indicamos que hable SOAP 1.2 ‐‐>
16.
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"
17.
<property name="soapVersion">
18. <util:constant static‐ field="org.springframework.ws.soap.SoapVersion.SOAP_12"/> 19. </property> 20. </bean> 21. 22. <!‐‐ 23.
payloadMapping: Redirige mensajes XML entrantes hacia el EndPoint apropiado.
24.
en función del PayLoad del SOAP:Body del mensaje.
25.
(Otra opción podría ser a través de la cabecera SOAPAction: org.springframewo
26.
‐‐>
27.
<bean id="payloadMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"
28.
<property name="endpointMap">
29.
<map>
30.
<!‐‐ ¡¡ Ojo !! No dejar espacios entre el namespace y el elemento raiz ‐‐> 31.
<entry key="{http://www.adictosaltrabajo.com/spring /ws/schemas}BooksInfoRequest" value‐ref="bibliotecaWSEndpoint"/>
32. </map> 33. </property> 34. </bean> 35. 36. 37.
<!‐‐ Este bean convertirá cualquier excepción Java en un fallos SOAP (SOAP Fault) ‐‐ 38.
<bean id="endpointExceptionResolver"
39.
class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver"
40.
<property name="defaultFault" value="RECEIVER,Server error" />
41.
<property name="exceptionMappings">
42.
<props>
43.
<prop key="org.springframework.oxm.UnmarshallingException">SENDER,Invalid request
44.
<prop key="org.springframework.oxm.ValidationFailureException">SENDER,Invalid request
45. </props> 46. </property> 47. </bean> 48. 49. 50.
<!‐‐ DynamicWsdl11Definition genera automáticamente el WSDL del servicio Web en base 51.
<bean id="bibliotecaWS" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"
52.
<property name="schema">
53.
<bean class="org.springframework.xml.xsd.SimpleXsdSchema">
54.
<property name="xsd" value="/WEB‐INF/bibliotecaWS.xsd"/>
55. </bean> 56. </property> 57. 58.
<property name="createSoap12Binding" value="true"/>
59.
<property name="portTypeName" value="bibliotecaWS"/>
60.
<property name="locationUri" value="http://localhost:8080/bibliotecaWS /services"/> 61. </bean> 62. </beans> 63.
Archivo de configuración y despliegue de la aplicación (/WEB-INF/web.xml):
Las peticiones SOAP serán atendidas por el servletview plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01.
<web‐app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org /2001/XMLSchema‐instance"
02.
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns /j2ee/web‐app_2_4.xsd"
03.
version="2.4">
04.
<display‐name>Autentia. Ejemplo de Spring‐WS</display‐name>
05. 06. <!‐‐ Configuración de Log4J ‐‐> 07. <context‐param> 08.
<param‐name>log4jConfigLocation</param‐name>
09.
<param‐value>/WEB‐INF/log4j.xml</param‐value>
10. </context‐param> 11. 12. <!‐‐ Configuración de Log4J ‐‐> 13. <listener> 14.
<listener‐class>org.springframework.web.util.Log4jConfigListener</listener‐ class> 15. </listener> 16. 17.
<!‐‐ Servlet que atenderá y redifirá penticiones SOAP ‐‐>
18.
<servlet>
19.
<servlet‐name>bibliotecaWS</servlet‐name>
20.
<servlet‐
class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet‐ class>
21.
22.
<!‐‐ Para que genere el WSDL desde el XSD ‐‐>
23.
<init‐param>
24.
<param‐name>transformWsdlLocations</param‐name>
25.
<param‐value>true</param‐value>
26. </init‐param> 27. <load‐on‐startup>1</load‐on‐startup> 28. </servlet> 29. 30. <servlet‐mapping> 31.
<servlet‐name>bibliotecaWS</servlet‐name>
32.
<url‐pattern>/services/*</url‐pattern>
33.
</servlet‐mapping>
34.
35.
<!‐‐ Para que devuelva el WSDL ‐‐>
36.
<servlet‐mapping>
37.
<servlet‐name>bibliotecaWS</servlet‐name>
38. <url‐pattern>*.wsdl</url‐pattern> 39. </servlet‐mapping> 40. </web‐app> 41.
Archivo de configuración de Maven 2: pom.xml:
A continuación exponemos el archivo de configuración de Maven, se presupone que el lector ya tiene nociones de Maven.
view plain print ?
<?xml version="1.0" encoding="UTF‐8"?>
01.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org /2001/XMLSchema‐instance" 02. xsi:schemaLocation="http://maven.apache.org /POM/4.0.0 http://maven.apache.org/maven‐v4_0_0.xsd"> 03. <modelVersion>4.0.0</modelVersion> 04.
<groupId>com.autentia.tutoriales</groupId>
05.
<artifactId>bibliotecaWS</artifactId>
06.
<packaging>war</packaging>
07.
<version>1.0‐SNAPSHOT</version>
08.
<name>BibliotecaWS con Spring‐WS</name>
09.
<url>http://www.adictosaltrabajo.com</url>
10. 11. <!‐‐ Sintáxis Java 5 ‐‐> 12. <build> 13. <plugins> 14. <plugin> 15.
<artifactId>maven‐compiler‐plugin</artifactId>
16. <configuration> 17. <source>1.5</source> 18. <target>1.5</target> 19.
<encoding>UTF‐8</encoding>
20. </configuration> 21. </plugin> 22. 23. </plugins> 24. </build> 25. 26. <dependencies> 27.
<!‐‐ Spring WS: Maven gestionará automáticamente todas sus dependencias, que no son p 28.
<dependency>
29.
<groupId>org.springframework.ws</groupId>
30.
<artifactId>spring‐ws‐core</artifactId>
31. <version>1.5.6</version> 32. </dependency> 33. </dependencies> 34. </project> 35.
Construcción y despliegue la aplicación:
A continuación ejecutamos el siguiente comando Maven: mvn package y desplegamos el archivo generado target\bibliotecaWS-1.0-SNAPSHOT.war en nuestro servidor preferido (JBoss, Tomcat, WebLogic, WebSphere, Jetty, etc..).
Ejemplo de construcción de un cliente (Axis2) para probar el
servicio web.
Este apartado da por sentado que el usuario ya sabe algo de Axis2, así que no voy a explicar con sumo detalle que es cada cosa (puedes consultar otros tutoriales en http://www.adictosaltrabajo.com de como se instala, configura, etc).
Como dije anteriormente, el servicio Web está desplegado y es capaz de autodescribirse a generando su propio WSDL, pues bien vamos a crear un cliente automáticamente desde su WDSL.
El código fuente de este tutorial puede ser descargado desde aquí (proyecto Eclipse).
%AXIS2_HOME%/bin/wsdl2java -sp -s -p com.autentia.tutoriales.spring.ws.cliente -uri http://localhost:8080/bibliotecaWS/bibliotecaWS.wsdl
En donde:
-sp: Por el namespace axis2 por defecto pone un namespace ns1 pero nuestro en el WS el Payload no está qualificado (no tiene namespace). Puedes verlo tu mismo copiando y pegando la URL en tu navegador...
-s: No queremos ni necesitamos que nos genere funcionalidad de invocación asíncrona. -p: En que paquete deseamos que nos genere las clases.
Invocando el servicio Web.
view plain print ? package com.autentia.tutoriales.spring.ws.cliente; 01. 02. import com.autentia.tutoriales.spring.ws.cliente.BibliotecaWSServiceStub.Libro_type0; 03. 04.
/**
05.* Ejemplo de invocación del WS de consulta de libros
06.* @author Carlos García. Autentia
07.* @see http://www.mobiletest.es
08.*/
09.
public class BibliotecaWSApp {
10.
public static void main(String[] args) throws Exception {
11.
BibliotecaWSServiceStub stub = new BibliotecaWSServiceStub();
12.
BibliotecaWSServiceStub.BooksInfoRequest peticion = new BibliotecaWSServiceStub.BooksInfoRequest();
13. 14. peticion.setCategoria("java"); 15. peticion.setNivel(BibliotecaWSServiceStub.NivelType.avanzado); 16. 17.
BibliotecaWSServiceStub.BooksInfoResponse respuesta = stub.BooksInfo(peticion
18.
19.
Libro_type0[] libros = respuesta.getLibro();
20.
if (libros != null){
21.
for (int i = 0, lcount = libros.length; i < lcount; i++){
22. System.out.println(libros[i].getEditorial() + " " + libros[i].getTitulo() + 23. } 24. } else { 25.
System.out.println("No hay libros");
26. } 27. } 28. } 29.
Y para terminar, al ejecutar la aplicación anterior, nos produce la siguiente salida: Editorial libro 0 Titulo libro 0 100 50
Editorial libro 1 Titulo libro 1 101 51 Editorial libro 2 Titulo libro 2 102 52 Editorial libro 3 Titulo libro 3 103 53 Editorial libro 4 Titulo libro 4 104 54
Referencias
http://static.springframework.org/spring-ws/docs/0.9.1/spring-ws-reference.pdf http://static.springsource.org/spring-ws/sites/1.5/reference/html/tutorial.html
Conclusiones
Bueno, como veis Spring no deja de sorprendernos en cuanto a su potencia y ventajas en el desarrollo de software de calidad (bajo acomplamiento, alta cohesión, etc.)
Resaltar que Spring también proporciona mucha funcionalidad para consumir servicios Web (hacer clientes), pero prefiero dejar esto para otro tutorial o para que el lector investige al respecto, haga un tutorial y nos lo mande para que lo publiquemos :-).
Un saludo, espero que os haya parecido útil este tutorial.
Carlos García. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.
¿Qué te ha parecido el tutorial? Déjanos saber tu opinión y ¡vota!
Muy malo Malo Regular Bueno Muy buenoPuedes opinar sobre este tutorial
haciendo clic aquí
.
Puedes firmar en nuestro libro de visitas
haciendo clic aquí
.
Puedes asociarte al grupo AdictosAlTrabajo en XING
haciendo clic
aquí
.
Añadir a favoritos Technorati.
Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5
Recuerda
Autentia
te regala la mayoría del conocimiento aquí compartido (
Ver
todos los tutoriales
). Somos expertos en: J2EE, Struts, JSF, C++,
OOP, UML, UP, Patrones de diseño ... y muchas otras cosas.
¿Nos vas a tener en cuenta cuando necesites
consultoría o formación en tu empresa?, ¿Vas a ser
tan generoso con nosotros como lo tratamos de ser
con vosotros?
Somos pocos, somos buenos, estamos motivados y nos gusta
lo que hacemos ...
Autentia = Soporte a Desarrollo & Formación.
[email protected]
Servicio de notificaciones:
Si deseas que te enviemos un correo electrónico cuando introduzcamos nuevos tutoriales. Formulario de subcripción a novedades:
Tutoriales recomendados
Nombre Resumen Fecha Visitas Valoración Votos Pdf Creación e
invocación de Webservices por SSL
En este tutorial se pretende enseñar a desplegar un webservice usando SSL y a invocarlo correctamente
2006-11-29 12617 Muy
bueno 2
Trabajando con Axis
Utilizando Apache Axis, os mostramos otro interesante tutorial que ilustra su utilización para implementar web services
2006-04-07 38807 Muy
bueno 15
Creando un servicio web a partir de su interfaz WSDL
En este tutorial se resalta la importancia de definir la interfaz de un servicio web antes de implementarlo, y cómo hacer todo esto con Eclipse y Apache Axis v1.
2006-09-26 17215 Muy
bueno 5
Servicio Web con NetBeans 6 y prueba con SoapUI
En este tutorial os enseñamos cómo crear y probar un servicio web de una manera sencilla utilizando netbeans 6 2007-08-02 9195 Bueno 4 Metro: pila de webservices de Sun. Integración con Maven 2
En este tutorial Germán nos enseñara a integrar la generación de webservices con Metro y Maven2.
2008-04-05 1967 Bueno 1
Metro: pila de webservices de Sun.
NE este tutorial Germán nos enseñara qué es y cómo usar Metro: pila de webservices de Sun en nuestras aplicaciones
2008-04-05 3226 Bueno 4
Axis2. Ejemplo de creación de un servicio Web
En este tutorial veremos como crear un servicio web a partir de un interface Java así como otros aspectos de está tecnología.
2008-04-04 4146 Bueno 5
Generador automático de Webservices
Os mostramos como crear un servicio Web a partir de una clases, gracias a generadores automáticos de código y NetBeans
2003-10-16 40272 Bueno 4
Monitorización de Web Services con Glassfish Wsmonitor
En este tutorial vamos a realizar una introducción a una
herramienta de monitorización de mensajes SOAP o Servicios Web en general.
2008-04-04 1432 -
-Jersey: la
implemetación de RESTFull de Sun
En este tutorial Germán nos enseña cómo usar RESTFull con la tecnología de Sun.
2008-04-05 1557 -
-Nota:
Los tutoriales mostrados en este Web tienen como objetivo la difusión del conocimiento. Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores. En algún caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueños. Si algún afectado desea que incorporemos alguna reseña específica, no tiene más que solicitarlo. Si alguien encuentra algún problema con la información publicada en este Web, rogamos que informe al administrador