JAX-WS
JAX-WS (Java™ API for XML-Based Web Services) es la siguiente generación del modelo de programación de servicios web que complementa la infraestructura que proporciona el modelo de programación JAX-RPC (Java API for XML-based RPC). Con JAX-WS, se simplifica el desarrollo de servicios web y clientes con una mayor independencia de la plataforma para las aplicaciones Java mediante el uso de anotaciones Java y proxies dinámicos.
JAX-WS es un modelo de programación que simplifica el desarrollo de aplicaciones mediante el soporte de un modelo basado en anotaciones estándar para desarrollar clientes y aplicaciones de servicio web. La tecnología JAX-WS se alinea estratégicamente con las tendencias actuales del sector hacia un modelo de mensajería más centrado en los documentos y sustituye el modelo de programación de llamada a procedimiento remoto tal como se define en JAX-RPC. Aunque el modelo de programación JAX-RPC y las aplicaciones siguen recibiendo soporte en este producto, JAX-RPC tiene limitaciones y no da soporte a varios servicios complejos centrados en los documentos. JAX-WS es el modelo de programación estratégico para desarrollar servicios web, además de ser una parte necesaria de Java Platform, Enterprise Edition 6 (Java EE 6). JAX-WS también se conoce como JSR 224.
La especificación JAX-WS 2.2 sustituye e incluye funciones de la especificación JAX-WS 2.1. JAX-WS 2.2 añade soporte del lado cliente para utilizar anotaciones relacionadas con WebServiceFeature como @MTOM, @Addressing y las anotaciones @RespectBinding. JAX-WS 2.1 anteriormente ha agregado soporte para estas anotaciones en el servidor. También existe ahora la posibilidad de habilitar y configurar el soporte de WS-Addressing en un cliente o servicio añadiendo aserciones WS-Policy en el documento WSDL. Además, los servicios web para la especificación Java EE 1.3 introducen soporte para estas anotaciones relacionadas con WebServiceFeature, así como soporte para utilizar los elementos del descriptor de despliegue para configurar estas características tanto en el cliente como en el servidor. JAX-WS 2.2 exige Java Architecture for XML Binding (JAXB) Versión 2.2 para el enlace de datos.
La implementación del estándar de programación JAX-WS proporciona las siguientes mejoras para desarrollar clientes y servicios web:
- Independencia de plataforma ampliada para aplicaciones Java.
Con las API de JAX-WS el desarrollo de los servicios y los clientes web se simplifica con una independencia de plataforma ampliada para aplicaciones Java. JAX-WS aprovecha el mecanismo de proxy dinámico para proporcionar un modelo de delegación formal con un proveedor conectable. Esto constituye una mejora respecto a JAX-RPC, que se basa en la generación de objetos stub específicos del proveedor para la invocación.
- Anotaciones
JAX-WS proporciona el soporte para anotar clases Java con metadatos para indicar que la clase Java es un servicio web. JAX-WS da soporte al uso de anotaciones basándose en la especificación del recurso de metadatos del lenguaje de programación Java (JSR 175), la especificación de metadatos de servicios web para la plataforma Java (JSR 181) y las anotaciones definidas por la especificación JAX-WS 2.2. Utilizando las anotaciones del origen Java y la clase Java se simplifica el desarrollo de los servicios web. Utilice las anotaciones para definir la información que se suele especificar en los archivos del descriptor de despliegue, los archivos WSDL o en la correlación de metadatos de archivos XML y WSDL con los artefactos de origen.
Por ejemplo, puede incorporar un código @WebService simple en el origen Java para exponer el bean como servicio web.
La anotación @WebService indica al entorno de ejecución del servidor que exponga todos los métodos públicos del bean como servicio web. Los niveles adicionales de granularidad se pueden controlar añadiendo anotaciones adicionales en métodos o parámetros individuales. La utilización de anotaciones facilita la exposición de artefactos Java como servicios web. Asimismo, mientras se crean artefactos a partir del uso de herramientas de correlación en sentido descendente desde un archivo WSDL, las anotaciones se incluyen en el origen y las clases Java como una forma de capturar los metadatos junto con los archivos de origen.@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
El uso de anotaciones también mejora el desarrollo de servicios web en una estructura en equipo, ya que no necesita definir cada servicio web en un descriptor de despliegue común o individual, como ocurre con los servicios web JAX-RPC. El uso de las anotaciones con servicios web JAX-WS permite el desarrollo paralelo del servicio y los metadatos necesarios.
Para los servicios Web JAX-WS, el uso del descriptor de despliegue webservices.xml es opcional porque puede utilizar anotaciones para especificar toda la información incluida dentro del archivo del descriptor de despliegue. Puede utilizar el archivo del descriptor de despliegue para aumentar o alterar temporalmente las anotaciones de JAX-WS existentes. Cualquier información que defina en el descriptor de despliegue webservices.xml altera temporalmente la información correspondiente especificada por las anotaciones.
Por ejemplo, si la clase de implementación de servicio del servicio web JAX-WS incluye lo siguiente:- la anotación @WebService:
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- el archivo webservices.xml especifica un nombre de archivo distinto para el documento WSDL, como se indica a continuación:
<webservices> <webservice-description> <webservice-description-name>ServicioEjemplo</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- la anotación @WebService:
- Invocación asíncrona de servicios web
Con JAX-WS, los servicios web se invocan de forma síncrona y asíncrona. JAX-WS añade soporte para un mecanismo de sondeo y de devolución de llamada cuando se invocan servicios web de forma asíncrona. Mediante el modelo de sondeo, un cliente puede emitir una solicitud y obtener un objeto de respuesta que se sondea para determinar si el servidor ha respondido. Cuando el servidor responde, se recupera la respuesta real. Mediante el modelo de devolución de llamada, el cliente proporciona un manejador de devolución de llamada para aceptar y procesar el objeto de respuesta de entrada. Tanto los modelos de sondeo como los de devolución de llamada permiten al cliente centrarse en seguir procesando el trabajo sin esperar una respuesta, a la vez que se proporciona un modelo más dinámico y eficaz para invocar servicios web.
Por ejemplo, una interfaz de servicio web puede tener métodos para las solicitudes síncronas y asíncronas. Las solicitudes asíncronos se identifican en negrita en el ejemplo siguiente:@WebService public interface CreditRatingService { // operación síncrona Score getCreditScore(Customer customer); // operación asíncrona con sondeo Response<Score> getCreditScoreAsync(Customer customer); // operación asíncrona con devolución de llamada Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
La invocación asíncrona que utiliza el mecanismo de devolución de llamada requiere una entrada adicional del programador del cliente. La devolución de llamada es un objeto que contiene el código de aplicación que se ejecutará cuando se reciba una respuesta asíncrona. Utilice el siguiente código de ejemplo para invocar un manejador de retorno de llamada asíncrono:CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // realizar algún trabajo... } } );
Utilice el siguiente ejemplo de código para invocar un cliente de sondeo asíncrono:CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Complete una acción mientras esperamos. } // No es necesaria la difusión, gracias los genéricos. Score score = response.get();
- Utilización de la inyección de recursos
JAX-WS da soporte a la inyección de recursos para simplificar aún más el desarrollo de servicios web. JAX-WS utiliza esta característica clave de Java EE 5 para trasladar la carga de crear e inicializar recursos comunes en un entorno de ejecución Java desde la aplicación de servicios web al propio entorno del contenedor de aplicaciones. JAX-WS da soporte a un subconjunto de anotaciones definidas en JSR-250 para la inyección de recursos y el ciclo de vida de aplicación en el entorno de ejecución.
El servidor de aplicaciones da soporte también al uso de la anotación @Resource o @WebServiceRef para declarar los clientes gestionados de JAX-WS y para solicitar la inyección de servicios y puertos JAX-WS. Cuando se utilice alguna de estas anotaciones en un campo o un método resultan en la inclusión de una instancia de puerto o servicio JAX-WS. El uso de estas anotaciones hace también que el tipo especificado por la anotación se enlace en el espacio de nombres JNDI.
La anotación @Resource está definida por la especificación JSR-250, Common Annotations, que se incluye en Java EE 5 (Java Platform, Enterprise Edition 5). Al colocar la anotación @Resource en una variable de tipo javax.xml.ws.WebServiceContext en una clase de implementación de punto final de servicio, puede solicitar una inclusión de recursos y recopilar la interfaz javax.xml.ws.WebServiceContext relacionada con dicha invocación de punto final. Desde la interfaz WebServiceContext, puede recopilar el MessageContext de la petición asociada con la llamada de método específica utilizando el método getMessageContext().
La anotación @WebServiceRef viene definida por la especificación JAX-WS.
En el ejemplo siguiente se ilustra el uso de las anotaciones @Resource y @WebServiceRef para la inclusión de recursos:@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
Consulte las secciones 5.2.1 y 5.3 de la especificación JAX-WS para obtener más información sobre la inyección de recursos.
- Enlace de datos con JAXB 2.2
JAX-WS utiliza la API y las herramientas JAXB (Java Architecture for XML Binding) 2.2 como tecnología de enlace para las correlaciones entre los objetos Java y los documentos XML. Las herramientas JAX-WS se basan en las herramientas JAXB para el enlace de datos predeterminado en las correlaciones de dos direcciones entre objetos Java y documentos XML. El enlace de datos JAXB sustituye al enlace de datos que se describe en la especificación JAX-RPC.
JAX-WS 2.2 requiere JAXB 2.2 para el enlace de datos. JAXB 2.2 proporciona mejoras menores en su anotaciones para la generación de esquemas mejorada y una mejor integración con JAX-WS.
- Clientes estáticos y dinámicos
La API de cliente dinámico para JAX-WS se denomina el cliente de asignación (javax.xml.ws.Dispatch). El cliente de asignación es un cliente orientado a la mensajería XML. Los datos se envían con la modalidad PAYLOAD o MESSAGE. Cuando se utiliza la modalidad PAYLOAD, el cliente de asignación sólo es responsable de proporcionar el contenido de <soap:Body> y JAX-WS añade los elementos <soap:Envelope> y <soap:Header>. Cuando se utiliza la modalidad MESSAGE, el cliente de asignación es responsable de proporcionar el sobre SOAP completo, incluidos los elementos <soap:Envelope>, <soap:Header> y <soap:Body>. JAX-WS no añade ningún elemento adicional al mensaje. El cliente de asignación da soporte a las invocaciones asíncronas utilizando un mecanismo de sondeo o devolución de llamada.
El modelo de programación de cliente estático de JAX-WS se denomina el cliente proxy. El cliente proxy invoca un servicio web en función de una SEI (interfaz de punto final de servicio), que se debe proporcionar.
- Soporte para MTOM
Utilizando JAX-WS, puede enviar documentos adjuntos binarios como, por ejemplo, imágenes o archivos, con las solicitudes de servicios web. JAX-WS añade soporte para la transmisión optimizada de datos binarios tal como se especifica en MTOM (Message Transmission Optimization Mechanism).
- Varias tecnologías de enlace de datos
JAX-WS proporciona las siguientes tecnologías de enlace al usuario final: XML Source, SAAJ (SOAP Attachments API for Java) 1.3 y JAXB (Java Architecture for XML Binding) 2.2. XML Source permite al usuario pasar javax.xml.transform.Source al entorno de ejecución que representa los datos en el objeto Source que se va a procesar. SAAJ 1.3 ofrece ahora la posibilidad de pasar un documento SOAP completo a través de la interfaz, en lugar de sólo la carga. Esta acción la lleva a cabo el cliente, para ello, pasa el objeto SOAPMessage de SAAJ a través de la interfaz. JAX-WS aprovecha el soporte JAXB 2.2 como tecnología de enlace de datos para elegir entre Java y XML.
- Soporte para SOAP 1.2
Se ha añadido a JAX-WS 2.0 el soporte para SOAP 1.2. JAX-WS da soporte a SOAP 1.1 y SOAP 1.2, por lo que puede enviar documentos adjuntos binarios como, por ejemplo, imágenes o archivos, con las solicitudes de servicios web. JAX-WS añade soporte para la transmisión optimizada de datos binarios tal como se especifica en MTOM.
- Herramientas de desarrollo
JAX-WS proporciona las herramientas de línea de mandatos wsgen y wsimport para generar artefactos portátiles para los servicios web JAX-WS. Cuando se crean servicios web JAX-WS, puede empezar con un archivo WSDL o una clase de bean de implementación. Si empieza con una clase de bean de implementación, utilice la herramienta de línea de mandatos wsgen para generar todos los artefactos de servidor de servicios web, incluido un archivo WSDL si es necesario. Si empieza con un archivo WSDL, utilice la herramienta de línea de mandatos wsimport para generar todos los artefactos de servicios web para el servidor o el cliente. La herramienta de línea de mandatos wsimport procesa el archivo WSDL con las definiciones de esquema para generar los artefactos portátiles, que incluyen la clase de servicio, la clase de interfaz de punto final de servicio y las clases JAXB 2.2 del esquema XML correspondiente.
- Soporte para servicios Web para Java EE, versión
1.3
Los servicios Web para la especificación Java EE versión 1.3 añade soporte para configurar las características MTOM, Addressing y RespectBinding en servicios y clientes de JAX-WS mediante el uso de anotaciones y entradas de descriptor de despliegue.
- Soporte de targetNamespace vacío para el estilo de parámetro
WRAPPED y los tipos de retorno JAX-WS 2.2 da soporte a los parámetros de método y tipos de retorno. En una operación de los servicios web de JAX-WS, puede definir una operación de servicios web con un parámetro de operación y un tipo de retorno opcional. Si el parámetro de operación y el tipo de retorno definen una propiedad targetNamespace vacía especificando un valor "" para la propiedad targetNamespace con la anotación @Webparam o @WebResult, el entorno de ejecución de JAX-WS se comporta de la siguiente manera:
- Si la operación es de estilo documento, el estilo de parámetro es WRAPPED y el parámetro no se correlaciona con una cabecera, un espacio de nombres vacío se correlaciona con los parámetros de operación y los tipos de retorno.
- Si el estilo de parámetro no es WRAPPED, se utiliza el valor del parámetro targetNamespace especificado mediante la anotación @webparam o @webresult.