• No se han encontrado resultados

Qué ofrece Autentia Real Business Solutions S.L?

N/A
N/A
Protected

Academic year: 2021

Share "Qué ofrece Autentia Real Business Solutions S.L?"

Copied!
18
0
0

Texto completo

(1)

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 Sistemas

Gran Empresa

Producción

autentia Certificación o Pruebas Verificación previa

RFP

Concurso

Consultora 1

Consultora 2

Consultora 3

Equipo propio desarrollo

Piloto

3a

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

(2)

Inicio Quienes somos Tutoriales Formación Colabora Comunidad Comic Charlas

Más

(3)

Catálogo de

servicios

Autentia (

PDF

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-04

Persistencia 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

(4)

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 (y

deben) 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:

(5)

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).

(6)

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.

(7)

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:

(8)

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.

(9)

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...

(10)

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.

(11)

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".

(12)

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 servlet

(13)

view 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.

(14)

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.

(15)

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 bueno

Puedes 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

(16)

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:

(17)

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

[email protected]

para su resolución.

(18)

Referencias

Documento similar

Finalizadas todas la configuraciones explicadas, pulsaremos (abajo del todo) el botón Guardar y Volver, si queremos crear otro curso; o en Guardar cambios y

La invalidez en el MMPI por no respuestas no se considera criterio positivo (sólo se puede considerar tal posibilidad en caso de daño neurológico que justifique tal estilo

Si aplica el principio de coste-beneficio, se dará cuenta de que la reduc- ción del número de alumnos sólo tiene sentido si el valor que tiene para los estudiantes asistir a la

“Dejemos claro que en la Biblia la iglesia cristiana no veneraba imágenes, no daba culto a los cristianos muertos ni consideraba a Pedro el vicario de Cristo por lo tanto la

Cada extensión tiene un interfaz y un procedimiento de uso propio por el que en algunos casos habrá que suscribirse a las URL del servicio de Descargas Inspire del Ministerio basado

A solicitud del programa “Promoción de la educación inclusiva e igualdad de oportunidades para niñas, niños y adolescentes migrantes y refugiados y de las comunidades de acogida

No obs- tante, ambos se caracterizan por seguir una distri- bución longitudinal a lo largo de los principales ejes fluviales (barrancos y gargantas) y caminos de

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones