JAX-WS 2.0: Vista rápida (II)



(Imagen: Rembrandt - Retrato de Titus como monje)

Supongo que al final la vista no era tan rápida que digamos xD. Seguimos con más características de JAX-WS 2.0

Contexto de Mensajes:
JAX-WS nos permite la manipulación del contexto del mensaje (javax.xml.ws.handler.MessageContext) mediante los handlers, endpoints y clientes. Este contexto viaja junto a los mensajes XML de request y response, y nos permite, entre otras cosas, la comunicación entre request handlers, implementaciones de endpoint y response handlers.

SOAP binding:
JAX-WS 2.0 especifica SOAP binding para el proceso de mensajes SOAP. Incluye el procesamiento de mustUnderstand, y soporta los roles nest y ultimateReceiver de SOAP 1.2. El SOAP binding soporta también el uso de SOAP handlers, para el procesamiento de headers SOAP, y mapea las excepiones handler y servicea mensajes de error SOAP.

Las implementaciones de JAX-WS deben soportar SOAP HTTP binding, SOAP con adjuntos y SOAP MTOM.

HTTP Binding
También disponemos de XML/HTTP binding para el despliegue y consumo de Web Services mediante el framework REST. Estos servicios (llamados RESTful) envían y reciben XML sobre un transporte HTTP sin utilizar SOAP.

Conversión de Excepciones a errores SOAP
JAX-WS realiza un mapeo de java.lang.Exception a mensajes de error SOAP (WSDL faults) que son enviados al cliente, incluso al utilizar servicios RESTful. Este proceso en controlado con la anotación WebFault.

Invocación Asíncrona
JAX-WS añade soporte asíncrono al modelo de invocación definido en JAX-RPC 1.1. La "asincronía" es un requisito fundamental de SOAP.

Operaciones one-way
JAX-WS soporta el mapping entre métodos Java y operaciones one-way de WSDL.

Manejo de Threads del lado del cliente
Para proveer control de threads, se puede utilizar instancias de java.util.concurrent.Executor en un cliente JAX-WS (como una instancia de javax.xml.ws.Service).

Estilos WSDL
JAX-WS le encarga la serialización a JAXB, pero para empacar los parámetros serializados en un mensaje SOAP, JAXB necesita de la asistencia de JAX-WS. Esta guía depende del estilo WSDL usado por el Web Service desplegado. JAX-WS soporta los estilos WSDL rpc/literal y document/literal.

Catálogos XML
JAX-WS soporta el uso de catálogos XML. Es útil para los documentos WSDL el importar esquemas externos para evitar duplicidad.

Pseudoreferencias
Las invocaciones de métodos Java pasan las referencias a objetos por valor. Los Web Services no trabajan así: al pasar un objeto a un Web Service, se envuelve una copia serializada de la instancia en un mensaje SOAP y ésta es enviada.

El pasar referencias es útil para, por ejemplo, invocar un método que cambie el estado de una instancia. JAX-WS nos prevee del mecanismo de pase de "pseudoreferencias", mediante la clase Holder.

Esto se hace posible al usar la clase Holder como referencia a nuestra instancia. Al invocar el Web Service, JAX-WS envía una copia de la instancia al destino, y obtiene una versión modificada de la misma. Detrás de bambalinas, JAX-WS actualiza la instancia de Holder para que referencie a la instancia devuelta por el Web Service.

Run-Time Endpoint Publishing (sólo Java SE)
JAX-WS nos permite publicar endpoints de Web Services en tiempo de ejecución. Existe un API (javax.xml.ws.Endpoint) que nos permite asignar una instancia de una implementación Web Service a una URL.

He aquí un ejemplo:

MyServiceImpl myWebService = ... //contruir Web Service
Endpoint myEndpoint = Endpoint.publish("http://localhost/myService", myWebService);

Eso es todo! El runtime de JAX-WS se encarga de crear la infraestructura necesaria. Eso incluye crear un contexto HTTP y el listening de request SOAP en el URL especificado. Al usar este enfoque, el contrato WSDL para el endpoint se crea dinámicamente en base a anotaciones o en documentos de metadata.

Con eso terminaríamos con JAX-WS... por ahora xD

Basado en el capítulo 2 de SOA Using Java Web Services de Mark D. Hansen


2 comments

Hola, talvés puedas darme una idea del siguiente error:

javax.xml.ws.soap.SOAPFaultException: MustUnderstand headers:[{http://www.w3.org/2005/08/addressing}Action] are not understood

La verdad no entiendo bien el tema.

Muchas gracias.

Reply

John por lo que veo el servicio estas manejando FAULT en tu WS y estás aplicando el addressing (No obligatorio su uso), de manejar incorrecta en tu código.

Reply

Publicar un comentario