Implementación de clientes de servicios web JAX-WS dinámicos
Puede desarrollar clientes de servicios web dinámicos basados en la especificación de servicios web para Java™ EE (Java Platform, Enterprise Edition) y el modelo de programación JAX-WS (API de Java para servicios en basados en XML).
Antes de empezar

Acerca de esta tarea
- Desarrollo de clientes de servicios web según el modelo de programación de JAX-WS
Los clientes de servicios web que pueden acceder a servicios web JAX-WS, e invocarlos, se desarrollan de acuerdo con los servicios web para la especificación Java EE (Java Platform, Enterprise Edition). El servidor de aplicaciones da soporte a clientes de Enterprise JavaBeans (EJB), clientes de aplicaciones Java EE, archivos de JavaServer Pages (JSP) y servlets basados en el modelo de programación JAX-WS. Los clientes de servicios web basados en la especificación JAX-RPC pueden invocar servicios web basados en JAX-WS, si el archivo WSDL (Web Services Description Language) cumple el perfil Web Services-Interoperability (WS-I) Basic Profile.
El modelo de programación del cliente JAX-WS da soporte a ambas API, la de Cliente de asignación y la de cliente de proxy dinámico. La API Dispatch client es un modelo de programación de cliente dinámico, mientras que el modelo de programación de cliente estático para JAX-WS es el cliente de proxy dinámico. Los clientes Dispatch y del proxy dinámico permiten la invocación síncrona y asíncrona de los servicios web JAX-WS.
La API del Cliente de asignación, javax.xml.ws.Dispatch, es un cliente orientado a mensajes XML indicado para desarrolladores de XML avanzados que prefieren utilizar construcciones XML. La API Dispatch puede enviar datos en la modalidad PAYLOAD o MESSAGE. Cuando se utiliza la modalidad PAYLOAD, el cliente Dispatch sólo es responsable de proporcionar los contenidos de soap:Body y JAX-WS incluye la carga de datos en un elemento soap:Envelope. Cuando se utiliza la modalidad MESSAGE, el cliente Dispatch es responsable de proporcionar todo el sobre SOAP. No es necesario un archivo WSDL si va a desarrollar un cliente dinámico.
En cambio, el cliente de proxy dinámico invoca un servicio web basado en una interfaz de punto final de servicio (SEI) que se proporciona. Las instancias de proxy dinámico de JAX-WS sacan partido de la función de proxy dinámico en el entorno básico JRE (Java Runtime Environment) Versión 6.
Para desarrollar clientes de servicios web basándose en el modelo de programación JAX-WS, debe determinar el modelo de cliente que mejor se adapta a las necesidades de la aplicación del servicio web. Si desea trabajar directamente con XML y no con una abstracción de Java y trabajar con la estructura de mensajes o la estructura de carga de mensajes, utilice la API Dispatch para desarrollar un cliente de servicios web dinámico. Sin embargo, si desea que el cliente de servicios web invoque el servicio según las interfaces de punto final de servicio con un proxy dinámico, utilice la API Dynamic Proxy para desarrollar un cliente de servicio web estático. Consulte la información sobre cómo implementar clientes de servicios web JAX-WS estáticos para obtener información acerca de cómo desarrollar clientes de servicios web estáticos.
Complete esta tarea para desarrollar un cliente de servicios web dinámicos utilizando la API Dispatch.
Para invocar servicios web de forma asíncrona utilizando un cliente JAX-WS estático o dinámico, determine si desea implementar el modelo de devolución de llamada o el modelo de sondeo. Lea sobre cómo invocar servicios web JAX-WS de forma asíncrona si desea más información respecto a la implementación asíncrona de la devolución de llamada o del sondeo para clientes de servicio web. El modelo de programación de JAX-WS para el servicio y el cliente utiliza anotaciones para representar la misma información que se proporcionó en un enlace de cliente JAX-RPC de una forma neutral respecto al proveedor.
- Clientes de servicios web gestionados y no gestionados JAX-WS
El servidor de aplicaciones da soporte a clientes de servicios web gestionados y no gestionados cuando se utiliza el modelo de programación JAX-WS:
- Clientes gestionados
Los servicios web para los clientes Java EE se definen mediante la especificación JSR (Java Specification Requirements) 109 y se conocen como clientes gestionados porque se ejecutan en un contenedor Java EE. Estos clientes se empaquetan como archivos EAR (Enterprise Archive) y contienen componentes que actúan como solicitantes de servicio. Estos componentes están formados por una aplicación de cliente Java EE, un componente web como por ejemplo un servlet o páginas JavaServer (JSP), o Enterprise JavaBeans (EJB) de sesión. Los clientes gestionados de servicios web utilizan las API JSR 109 y la información de despliegue para buscar e invocar un servicio web.
Para los clientes gestionados, puede utilizar la búsqueda JNDI (Java Naming and Directory Interface) para realizar la búsqueda de servicios o puede utilizar anotaciones para insertar instancias de un puerto o servicio JAX-WS. Lea acerca de cómo configurar Web Services Security: de señal UserName, de firma digital y de señal LTPA (Lightweight Third-Party Authentication). El código siguiente es un ejemplo de una búsqueda de contexto compatible con JSR 109:
InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
Puede utilizar la anotación @WebServiceRef o @Resource para declarar clientes gestionados. El uso de estas anotaciones hace que el tipo especificado por la anotación se enlace en el espacio de nombres JNDI. Cuando las anotaciones se utilizan en un campo o un método, resultan en la inclusión de una instancia de puerto o servicio JAX-WS. Puede utilizar estas anotaciones en lugar de declarar entradas de service-ref en el descriptor de despliegue del cliente. También puede utilizar el descriptor de despliegue del cliente para declarar clientes gestionados de JAX-WS, de modo parecido a los clientes gestionados de JAX-RPC. También puede utilizar el descriptor de despliegue para alterar temporalmente y aumentar la información especificada por las anotaciones @WebServiceRef y @Resource. Utilice la anotación @WebServiceRef para enlazar e inyectar una instancia de puerto o servicio JAX-WS. Sólo puede utilizar la anotación @Resource para enlazar una instancia de servicio JAX-WS. Sólo se da soporte al uso de cualquiera de estas anotaciones para declarar los clientes gestionados de JAX-WS en determinados tipos de clases. Entre algunos de estos tipos de clases se incluyen las clases de implementación de punto final JAX-WS, las clases de manejador JAX-WS, las clases de enterprise bean y las clases de servlet.
El ejemplo siguiente utiliza la anotación @WebServiceRef para obtener una instancia de FredsBank:
Ahora dentro de la clase, no se ha de inicializar el campo fredsBank. Puede utilizar este campo directamente:@WebServiceRef(name=”service/FredsBankPort”, value=FredsBankService.class) FredsBank fredsBank;
long balance = fredsBank.getBalance();
También puede utilizar la anotación @WebServiceRef para obtener instancias de clases de servicio JAX-WS; por ejemplo:@WebServiceRef(name=”service/FredsBankService”) FredsBankService service;
Ahora dentro de la clase, no se ha de inicializar el campo service. Puede utilizar este campo directamente:FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
Además de la anotación @WebServiceRef, puede utilizar la anotación @Resource para obtener una instancia de las clases de servicio JAX-WS; por ejemplo:@Resource(name=”service/FredsBankService”, type=FredsBankService.class) FredsBankService service;
Del mismo modo que con la anotación @WebServiceRef, puede utilizar el campo service sin instancias; por ejemplo:FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
Puede utilizar las anotaciones @Resource o @WebServiceRef en una clase. En este caso, JNDI se debe utilizar para buscar el servicio o el puerto JAX-WS; por ejemplo:@WebServiceRef(name=”service/FredsBankService”, type=FredsBankService”) public class J2EEClientExample { … … public static void main(String[] args) { … … InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance(); } … }
Para obtener más información acerca de cómo utilizar las anotaciones @WebServiceRef y @Resource, consulte las especificaciones de JSR-109, JSR-224, JSR-250 y Java Platform Enterprise Edition 5 (Java EE 5).
Como se ha mencionado antes, cuando utilice anotaciones o JNDI para obtener instancias de puertos y servicios JAX-WS, no cree instancias de los objetos devueltos. Si esto se lleva a cabo, el resultado sería el de una instancia de cliente no gestionado. El ejemplo siguiente muestra un ejemplo de un uso incorrecto:@WebServiceRef(name=”service/FredsBankService”) FredsBankService service; service = new FredsBankService(); // el cliente pasa a ser no gestionado.
Para los clientes JAX-WS gestionados que se declaran mediante la anotación @WebServiceRef o @Resource y para los clientes que se declaran utilizando las entradas service-ref del descriptor de despliegue del cliente, puede utilizar la consola administrativa para proporcionar el URL de punto final que utiliza el cliente. Este URL especificado altera temporalmente el URL de punto final del documento WSDL que utiliza el cliente. Para obtener más información sobre cómo especificar este URL de punto final, consulte la documentación Configuración de los enlaces de cliente de servicios web.
- Clientes no gestionados
Los clientes de Java Platform, Standard Edition (Java SE 6) que utilizan el entorno de ejecución JAX-WS para invocar servicios web y no se ejecutan en un contenedor Java EE se conocen como clientes no gestionados. Un cliente de servicios web no gestionado es un cliente Java autónomo que puede inspeccionar directamente un archivo WSDL y formular las llamadas al servicio web utilizando las API JAX-WS. Estos clientes se empaquetan como archivos JAR que no contienen ninguna información de despliegue.
- Clientes gestionados
A partir de WebSphere Application Server versión 7.0 y posterior, los módulos de aplicación Java EE 5 (los módulos de la aplicación web de la versión 2.5 o superior, o los módulos EJB de versión 3.0 o superior) se examinan para ver anotaciones para identificar los servicios y clientes JAX-WS. Sin embargo, los módulos de aplicaciones anteriores a Java EE 5 (módulos de aplicaciones web versión 2.4 o anteriores o módulos EJB versión 2.1 o anteriores) no se exploran para ver si contienen anotaciones JAX-WS, de manera predeterminada, por razones de rendimiento. En el paquete de características de la versión 6.1 para servicios Web, el comportamiento predeterminado es explorar los módulos de aplicaciones Web anteriores a Java EE 5 para identificar los servicios JAX-WS y explorar los módulos de aplicaciones web anteriores a Java EE 5 y los módulos EJB en busca de clientes de servicio durante la instalación de aplicaciones. Puesto que el comportamiento predeterminado de WebSphere Application Server Versión 7.0 y posteriores es no explorar módulos anteriores a Java EE 5 en busca de anotaciones durante la instalación de aplicaciones o el arranque de servidor, para conservar la compatibilidad con los releases anteriores del paquete de características, deberá configurar la propiedad UseWSFEP61ScanPolicy en META-INF/MANIFEST.MF de un archivo archivador web (WAR) o un módulo EJB o definir la propiedad personalizada de máquina virtual Java, com.ibm.websphere.webservices.UseWSFEP61ScanPolicy, en los servidores para solicitar la exploración durante la instalación de aplicaciones y el arranque de servidor. Para obtener más información sobre la exploración de anotaciones, consulte la información sobre las anotaciones de JAX-WS.
Procedimiento
Resultados
Habrá creado y probado una aplicación cliente de servicios web.
Qué hacer a continuación
Después de que desarrolla un cliente de aplicaciones de servicios web y se enlaza estáticamente el cliente, el punto final de servicio que utiliza la implementación es aquél que se identifica en el archivo WSDL que ha utilizado durante el proceso de desarrollo. Durante o después de la instalación de la aplicación de servicios web, quizá desee cambiar el punto final de servicio. Para los clientes gestionados, puede cambiar el punto final con la consola administrativa o con la herramienta del script wsadmin. Para clientes de servicios web JAX-WS no gestionados, puede cambiar el punto final desde la aplicación cliente.
Adicionalmente, puede personalizar los servicios web implementando extensiones en el cliente de servicio web. Algunos ejemplos de estas extensiones son el envío y la recepción de valores en cabeceras SOAP o el envío y la recepción de cabeceras de transporte HTTP o JMS (Java Message Service). Para obtener más información acerca de estas extensiones, lea acerca de la implementación de extensiones en los clientes de servicios web.