Páginas

jueves, 16 de febrero de 2012

Primate programming

Hace unos días leía en Mundo geek una cita de James Goldsmith que decía:
Si pagas cacahuetes, obtienes monos
Generalmente cierto. También es verdad que muchos conocen perfectamente esa relación y qué obtendrán con cacahuetes sin embargo, piensan que un grupo de monos puede llevar a cabo cualquier tarea. A esas personas, les dejo este enlace donde pueden encontrar primates con gran experiencia a unas tasas muy reducidas.

Depurar mensajes SOAP con Spring WS

Son muchos los que preguntan por la red cómo depurar (logar, tracer, ...) los mensajes SOAP cuando se utiliza Spring WS. Yo también me lo he preguntado así que aquí va la solución.

Lo primero que hay que saber es que no es lo mismo depurar los mensajes SOAP cuando estamos en el lado del cliente, es decir, estamos implementando una llamada a un servicio Web o en el lado del servidor, esto es, estamos implementando el servicio Web. La forma de depurar los mensajes SOAP es distinta para cada caso.

En el lado del servidor tenemos dos alternativas:
  • Utilizar interceptores. Concretamente debemos utilizar PayloadLoggingInterceptor SoapEnvelopeLoggingInterceptor. Podéis encontrar información más detallada en la documentación de Spring, justo aquí. Cuando os decidais por uno de los interceptores, no hay que olvidad activar el nivel de DEBUG para el paquete al que pertenece.
  • Activar el nivel DEBUG o TRACE para el paquete org.springframework.ws.server.MessageTracing. Más información aquí.
En el lado del cliente:
  • Activar el nivel de DEBUG o TRACE para unos paquetes particulares:
    • org.springframework.ws.client.MessageTracing.sent para los mensajes salientes
    • org.springframework.ws.client.MessageTracing.received para mensajes entrantes.

martes, 14 de febrero de 2012

Servicios Web y XML

Recientemente he estado trabajando con Servicio Web con Spring WS y me he encontrado algunos problemas de librerías relacionadas con Servicios Web y XML, especialmente al desplegar estos servicios en servidores de aplicaciones como Welogic o JBoss. Tras algunas tortas me ha quedado medianamente claro para qué sirven algunas de las librerías. En este post trato de aclarar algo para qué sirven todas estas librerías.

  • SAAJ (SOAP with Attachments API for Java). Proporciona una forma estándar de enviar documentos XML a través de Internet desde Java. Dicho de otra forma, SAAJ permite a producir y consumir mensajes acorde con la especificación SOAP 1.1 y SOAP con adjuntos. Otros datos:
    • Opera a un nivel inferior que JAX-RPC y JAX-WS que usan SAAJ.
    • Forma parte del JDK. Particularmente, la versión Java 6 incluye SAAJ 1.3
    • Para aplicaciones Web, la implementación es típicamente provista por el servidor de aplicaciones.
  • JAXP (Java Api for XML Processing). API Java (definido por Sun Microsystems) sirve para la manipulación y el tratamiento de archivos XML. Otros datos:
    • Es parte del JDK. En  la versión Java 6 podemos encontrar JAXP 1.4 mientras que en Java 5 encontramos la versión 1.3 que está obsoleta.
    • El JDK también proporciona una implementación (Xerces a partir de JDK5 y anteriormente Crimson).
  • JAXB (Java Architecture for XML Binding). Permite a los desarrolladores Java mapear clases Java a representaciones XML. JAXB proporciona dos características principales: la habilidad de convertir (marshal) objetos Java en XML y viceversa. En otras palabras, permite almacenar y extraer datos en memoria en cualquier formato XML sin la necesidad de tener que implementar código específico. Otros datos:
    • Es parte de JDK. Particularmente, la versión Java 6 (updated 4) viene con  JAXB 2.1
    • La implementación de referencia es parte del proyecto Glassfish
    • Aquí encontrarás una descripción más completa sobre JAXB
  • JAX-RPC (Java API XML para RPC) es una especificación para desarrolladores Java para el desarrollo de Web servicios basados en SOAP. Este API está obsoleto en favor de JAX-WS. Otros datos:
    • Tiene su propio modelo de mapeo de datos (data mapping model) que cubre el 90% de los esquemas. Los esquemas que no son cubiertos son mapeados  javax.xml.soap.SOAPElement.
    • El modelo controlador (handler model) está basado en SAAJ 1.2
    • Era el API de Servicios Web en el JDK1.4
  • Apache Xerces. Es una librería de Apache para el parseo, validación, serialización y manipulación de XML. Actualmente se encuentra en su versión 2 y aunque se puede encontrar como una librería independiente también forma parte del JDK. Otros datos:
    • Ofrece una implementación del API JAXP 1.4 entre otros APIs
    • Fue re-paquetizado bajo el paquete com.sun en el JDK5
    • La implementación es típicamente provista por el servidor de aplicaciones como se describe aquí.
  • Apache Xalan. Es un procesador XSLT para la transformación de documentos XML en documentos HTML, textos, u toros tipos de documentos XML. Otros datos:
    • Al igual que Xerces, forma parte del JDK y a partir de la versión 5 fue re-paquetizado bajo sun.com.
    • Implemente XPath entre otros.
    • La versión 1 ya no está soportada por lo que es recomendable trabajar con la versión 2.
  • JAX-WS (Java Api for XML Web Services) es el API Java que se utiliza para la creación de Web Service. JAX-WS forma parte del estándar Java EE. La implementación de referencia de JAX-WS es parte del proyecto GlassFish. En la plataforma Java EE 5, JAX-WS 2.0 reemplaza al API JAX-RPC (obsoleto). El cambio se basa en moverse hacia Web Services orientados a documentos (en vez de RPC). Otros datos:
    • Como modelo de mapeo de datos utiliza JAXB
    • El controlador de modelo (model handler) se base en SAAJ 1.3
    • Pasó a formar parte del JDK5 en su versión 2.0. La versión  JAX-WS 2.1 fue introducida en Java 6 Update 4.
    • JAX-WS 2.1 fue incluido en Java 6, particularmente en JDK 1.6.0_04 y superior.
    • JAX-RPC vs JAX-WS
Por último, dejo algunos enlaces interesantes: