API de Java para servicios web basados en XML

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.

La implementación del estándar de programación JAX-WS proporciona las siguientes mejoras para desarrollar clientes y servicios web:
Mayor independencia de la plataforma para las aplicaciones Java
Utilizando las API JAX-WS, el desarrollo de clientes y servicios web se ha simplificado, con una mayor independencia de la plataforma para las aplicaciones Java. JAX-WS aprovecha los proxies dinámicos, mientras que JAX-RPC utiliza los apéndices generados. El cliente de proxy dinámico invoca un servicio web basado en una interfaz de punto final de servicio (SEI) que se genera o proporciona. El cliente de proxy dinámico es similar al cliente de apéndice en el modelo de programación JAX-RPC. Aunque el cliente de proxy dinámico de JAX-WS y el cliente de apéndice de JAX-RPC se basan en la interfaz de punto final de servicio (SEI) que se genera a partir de un archivo WSDL, existe una diferencia importante. El cliente de proxy dinámico se genera dinámicamente en el tiempo de ejecución utilizando la funcionalidad de proxy dinámico Java 5, mientras que el cliente de apéndice basado en JAX-RPC es un archivo Java no portátil que se genera mediante las herramientas. A diferencia de los clientes de apéndice de JAX-RPC, el cliente de proxy dinámico no necesita que regenere un apéndice antes de ejecutar el cliente en un servidor de aplicaciones de un proveedor diferente, ya que la interfaz generada no requiere la información específica del proveedor. Consulte el capítulo 4 de la especificación JAX-WS 2.0 para obtener más información sobre la utilización de clientes de proxy dinámico.
Anotaciones

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.

Invocación asíncrona de servicios web

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

En el ejemplo siguiente se ilustra el uso de las anotaciones @Resource y @WebServiceRef para la inyecció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 como la 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 bidireccionales entre los objetos Java y los documentos XML. El enlace de datos JAXB sustituye al enlace de datos que se describe en la especificación JAX-RPC.

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.

Clientes estáticos y dinámicos
La API de programación de cliente dinámico de 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 del elemento <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 sólo es responsable de proporcionar el sobre SOAP completo, incluidos los elementos <soap:Envelope>, <soap:Header> y <soap:Body>, y JAX-WS no añade nada al mensaje. El cliente de asignación da soporte a las invocaciones asíncronas utilizando un mecanismo de sondeo o devolución de llamada. </soap:Body></soap:Header></soap:Envelope></soap:Header></soap:Envelope></soap:Body>

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.

Soporte 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 como se especifica en MTOM (Message Transmission Optimization Mechanism).
Varias estructuras de carga útil
JAX-WS expone las siguientes tecnologías de enlace al usuario: Origen XML, API de adjuntos SOAP para Java (SAAJ) 1.3 y Arquitectura Java para enlaces XML (JAXB) 2.0. Origen XML permite a un usuario pasar un javax.xml.transform.Source al entorno de ejecución que representa los datos en un objeto de origen que se debe pasar al tiempo de ejecución. 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 útil. Para ello, el cliente pasa el objeto SOAPMessage SAAJ a través de la interfaz. JAX-WS aprovecha el soporte JAXB 2.0 como tecnología de enlace de datos para elegir entre Java y XML.
Soporte de SOAP 1.2
Se ha añadido soporte de SOAP 1.2 a JAX-WS 2.0. JAX-WS da soporte a SOAP 1.1 y SOAP 1.2. SOAP 1.2 proporciona una definición más específica del modelo de proceso SOAP, que suprime muchas de las ambigüedades que pueden generar problemas de interoperatividad cuando no existen perfiles WS-I (Web Services-Interoperability). SOAP 1.2 debe reducir la probabilidad de que existan problemas de interoperatividad con las implementaciones de SOAP 1.2 entre distintos proveedores. No es interoperativo con versiones anteriores.
Soporte de parámetros de método y tipos de retorno
JAX-WS 2.2 da soporte a parámetros de método y tipos de retorno. En una operación de servicios web 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 mediante la anotación @WebParam o, la anotación @WebResult, el entorno de ejecución JAX-WS se comporta de la siguiente manera:
  • Si la operación es un estilo de documento, el estilo del 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 la 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 con la anotación @WebParam o @WebResult.

JAX-WS 2.1.6

Cuando se crea un servicio web JAX-WS a partir de una clase Java, los métodos públicos de la clase se exponen como operaciones y forman parte del contrato WSDL del servicio web. La correlación entre estos métodos y operaciones está controlada principalmente por JSR-181 y JSR-250. Con estas normas, un método público en una clase Java y su jerarquía hasta pero sin incluir java.lang.Object se exponen cuando se cumplen las siguientes condiciones:
  • El método se anota con @WebMethod o @WebMethod(exclude=false) y la clase que lo contiene tiene una anotación @WebService
  • El método no tiene ninguna anotación @WebMethod, pero la clase que lo contiene tiene una anotación @WebService y no hay otros métodos que se anoten con @WebMethod o @WebMethod(exclude=false)
JAX-WS 2.1.6 altera las normas sobre cómo se exponen los métodos de una clase Java en la interfaz de servicio web. Ahora, un método público en una clase Java y su jerarquía hasta pero sin incluir java.lang.Object se exponen cuando se cumplen las siguientes condiciones:
  • El método tiene una anotación @WebMethod o @WebMethod(exclude=false).
  • El método no tiene ninguna anotación @WebMethod, pero la clase que lo contiene tiene una anotación @WebService.
Ejemplo:
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 Ventana > Preferencias > General > Políticas de servicio > Modelos de programación de WebSphere > JAX-WS y establezca el valor de instrucciones de exposición de método JAX-WS 2.1.6 en true.

JAX-WS 2.2

Los entornos de ejecución de servidor que dan soporte a las especificaciones JAX-WS Versión 2.2 y Servicios web para Java EE (JSR 109) Versión 1.3 son:
  • WebSphere Application Server Liberty Profile V8.5.5
  • WebSphere Application Server V8.5
  • WebSphere Application Server V8.0

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

Icono que indica el tipo de tema Tema de conceptos
Términos y condiciones para centros de información | Comentarios

Icono de indicación de fecha y hora Última actualización: 22 de abril de 2014

Nombre de archivo: cjaxws.html