La API de Java™ para servicios web basados en XML (JAX-WS), también conocida como JSR-224, es el modelo de programación de servicios web de próxima generación que amplía la base proporcionada por el modelo de programación de la API de Java para RPC basado en XML (JAX-RPC). Utilizando JAX-WS, el desarrollo de clientes y servicios web se simplifica con una mayor independencia de la plataforma para las aplicaciones Java mediante el uso de proxies dinámicos y anotaciones Java. Las herramientas de servicios web que se incluyen en este producto dan soporte a JAX-WS 2.0, 2.1 y 2.2.
JAX-WS es un nuevo modelo de programación que simplifica el desarrollo de aplicaciones mediante el soporte de un modelo estándar basado en anotaciones para desarrollar clientes y aplicaciones de servicio web. El estándar de programación JAX-WS se alinea estratégicamente con las tendencias actuales del sector hacia un modelo de mensajería más centrado en los documentos, que sustituye al modelo de programación de llamada a procedimiento remoto según está definido por JAX-RPC. Aunque este producto continúa dando soporte al modelo de programación y a las aplicaciones JAX-RPC, JAX-RPC tiene limitaciones y no da soporte a muchos servicios actuales centrados en los documentos. JAX-WS es el modelo de programación estratégico para desarrollar servicios web y es una parte necesaria de la plataforma Java EE 5.
JAX-WS introduce el soporte para anotar las clases Java con metadatos para indicar que la clase Java es un servicio web. JAX-WS da soporte al uso de anotaciones basadas en la especificación de Recurso de metadatos para el lenguaje de programación Java (JSR 175), la especificación de Metadatos de servicios web para la plataforma Java (JSR 181) y las anotaciones que están definidas por la especificación JAX-WS 2.0. La utilización de anotaciones en el origen Java y en la clase Java simplifica el desarrollo de servicios web al definir parte de la información adicional que generalmente se obtiene de los archivos de descriptor de despliegue, los archivos WSDL, o correlacionando los metadatos de los 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 un servicio web.
@WebService
public class QuoteBean implements StockQuote {
public float getQuote(String sym) { ... }
}
La anotación @WebService indica al entorno de ejecución del servidor que exponga todos los métodos públicos en el bean como un servicio web. Los niveles adicionales de granularidad pueden controlarse 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, como los artefactos se crean utilizando algunas de las herramientas de correlación en sentido descendente que se inician desde un archivo WSDL, las anotaciones se incluyen en el origen y las clases Java como una forma de capturar metadatos junto con los archivos de origen.
Con JAX-WS, los servicios web pueden invocarse de forma síncrona y asíncrona. JAX-WS añade soporte para un mecanismo de sondeo y un mecanismo de devolución de llamada cuando se invocan servicios web de forma asíncrona. Utilizando un 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. Con el modelo de sondeo, el cliente puede continuar procesando otro trabajo sin esperar la devolución de una respuesta. Si utiliza 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. Los modelos de sondeo y devolución de llamada permiten al cliente centrarse en el proceso de trabajo a la vez que proporcionan un modelo más dinámico y eficaz de invocar servicios web.
Por ejemplo, una interfaz de servicio web tiene métodos para las solicitudes síncronas y asíncronas.
@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. El manejador de 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. A continuación, se muestra un código de ejemplo de un manejador de devolución 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...
}
}
);
A continuación, se muestra un código de ejemplo de un cliente de sondeo asíncrono:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerFred);
while (!response.isDone()) {
// realizar algún trabajo durante la espera
}
// no es necesaria ninguna difusión, gracias a los genéricos
Score score = response.get();
</Score>
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 solicitar la inyección de servicios y puertos JAX-WS. Cuando se utiliza alguna de estas anotaciones en un campo o un método, provoca la inyección de una instancia de puerto o servicio JAX-WS. El uso de estas anotaciones también provoca el enlace del tipo especificado por la anotación con el espacio de nombres JNDI.
La anotación @Resource está definida por la especificación JSR-250 de Anotaciones comunes 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 inyección de recursos y recopilar la interfaz javax.xml.ws.WebServiceContext relacionada con la invocación de punto final. Desde la interfaz WebServiceContext, puede recopilar el MessageContext de la solicitud asociada con la llamada de método específica utilizando el método getMessageContext().
@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.
WebSphere Application Server Versión 7.0 da soporte a la especificación JAXB 2.1. JAX-WS 2.1 requiere JAXB 2.1 para el enlace de datos. JAXB 2.1 proporciona mejoras como, por ejemplo, el soporte de compilación mejorado, el soporte de la anotación @XMLSeeAlso y el soporte 1.0 de esquema completo.
WebSphere Application Server Versión 8.0 o posteriores y WebSphere Application Server Liberty Profile V8.5.5 dan soporte a la especificación JAXB 2.2. JAX-WS 2.2 requiere JAXB 2.2 para el enlace de datos. JAXB 2.2 añade pequeñas mejoras a sus anotaciones, para mejorar la generación de esquemas y la integración con JAX-WS.
El modelo de programación de cliente estático de JAX-WS se denomina el cliente de proxy. El cliente de proxy invoca un servicio web basado en una interfaz de punto final de servicio (SEI) que se genera o proporciona.
public class Base
{
@WebMethod(exclude=false)
public void superExposed(String s) {}
public String supernoanno(String s) {}
}
@WebService
public class BeanImpl extends Base
{
@WebMethod(exclude=false)
public void exposed(String s) {}
public String nonpublic(String s) {}
}
Antes de JAX-WS 2.1.6, el único método expuesto era public void exposed(String s). En JAX-WS 2.1.6 y posteriores, se exponen los métodos siguientes: public void exposed(String s)
public String nonpublic(String s)
public void superExposed(String s)
WebSphere Application Server Versión 7.0.0.7 y posteriores incluyen estos cambios a través de IBM® JDK 6 SR6. Para que el entorno de trabajo pueda proporcionar instrucciones sobre el uso de JAX-WS 2.1.6, vaya a true.
y establezca el valor de instrucciones de exposición de método JAX-WS 2.1.6 enLa 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 del cliente para utilizar anotaciones relacionadas con WebServiceFeature como, por ejemplo, @MTOM, @Addressing y @RespectBinding. JAX-WS 2.1 había añadido anteriormente soporte para estas anotaciones en el servidor. Asimismo, la especificación Servicios web para Java EE 1.3 introduce el soporte para las anotaciones relacionadas con WebServiceFeature, así como el soporte para utilizar los elementos del descriptor de despliegue para configurar estas características en el cliente y el servidor. JAX-WS 2.2 necesita JAXB (Arquitectura Java para enlaces XML) Versión 2.2 para enlazar datos.
Para obtener más información sobre JAX-WS, consulte la especificación JSR-224 oficial: JSR 224: API de Java para servicios web basados en XML (JAX-WS) 2.0