Creación de una aplicación de servicio web JAX-WS que utiliza direccionamiento de servicios web

El direccionamiento de servicios web (WS-Addressing) ayuda a la interoperatividad entre los servicios web mediante la definición de un método estándar para direccionar servicios web y para proporcionar información de direccionamiento en los mensajes. Esta tarea describe los pasos necesarios para crear un servicio web JAX-WS al que se accede utilizando una referencia de punto final de WS-Addressing. Esta tarea también describe los pasos adicionales que son necesarios para utilizar recursos con estado como parte del servicio web.

Antes de empezar

Los pasos descritos en esta tarea se aplican a servidores y clientes que se ejecutan en WebSphere Application Server.

Acerca de esta tarea

Realice esta tarea si está creando un servicio web JAX-WS que utiliza la especificación WS-Addressing. Esta tarea utiliza las API WS-Addressing de JAX-WS para crear la referencia de punto final necesaria. También puede crear referencias de punto final utilizando la API WS-Addressing propietaria de IBM, y convertirlas en objetos de la API JAX-WS para su uso con el resto de la aplicación.

Procedimiento

  1. Proporcione una interfaz de servicio web que devuelva una referencia de punto final al servicio de destino.

    La interfaz debe devolver una referencia de punto final, que puede realizarse utilizando una operación de fábrica o un servicio de fábrica independiente. El servicio de destino puede atender una instancia de recurso, por ejemplo, un carro de la compra.

  2. Implemente el servicio web creado en el paso anterior. Para la parte WS-Addressing de la implementación, realice los pasos siguientes:
    1. Opcional: Incluya anotaciones para especificar el comportamiento de WS-Addressing. Consulte Anotaciones de direccionamiento de servicios web para obtener más detalles.
    2. Opcional: Si la interfaz implica un servicio web que atiende una instancia de recurso, cree o busque la instancia de recurso.
    3. Opcional: Si utiliza una instancia de recurso, obtenga el identificador del recurso. El identificador de recurso depende de la aplicación y podría generarse durante la creación de la instancia de recurso.
      Atención: No incluya información importante en el identificador de recurso, ya que el identificador se propaga en el mensaje SOAP.
    4. Cree una referencia de punto final que haga referencia al servicio web, siguiendo las instrucciones en Creación de referencias de punto final utilizando la API de direccionamiento de servicios web JAX-WS.. Si utiliza una instancia de recurso, pase el identificador de recurso como parámetro.
    5. Vuelva a la referencia del punto final.
  3. Si el servicio web utiliza instancias de recurso, amplíe la implementación para que coincidan los mensajes entrantes con las instancias de recurso apropiadas. Puesto que ha asociado el identificador de recurso a la referencia del punto final que ha creado anteriormente, cualquier mensaje entrante direccionado a dicha referencia de punto final contendrá la información del identificador de recurso, como un parámetro de referencia en la cabecera SOAP del mensaje. Puesto que el identificador de recurso se pasa a la cabecera SOAP, no tendrá que exponerlo en la interfaz del servicio web. Cuando WebSphere Application Server recibe el mensaje, coloca esta información en el contexto del mensaje de la hebra. Amplíe la implementación para realizar las acciones siguientes:
    1. Obtener el identificador de instancia de recurso desde el contexto del mensaje.
      • Si utiliza el espacio de nombres 2005/08 WS-Addressing, use la propiedad REFERENCE_PARAMETERS de la clase MessageContext.
      • Si utiliza el espacio de nombres 2004/08 WS-Addressing, debe utilizar la API WS-Addressing de IBM, concretamente el método EndpointReferenceManager.getReferenceParameterFrom MessageContext(QName resource_id).
      Utilice el método siguiente para el espacio de nombres 2005/08:
      ...
      List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
      ...
      Utilice el método siguiente para el espacio de nombres 2004/08:
      ...
      
      String resource_identifier = 
              EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
      ...
    2. Reenvíe el mensaje a la instancia de recurso adecuada.
  4. Opcional: Configure un cliente proxy para comunicar con el servicio.
    1. Utilice la herramienta wsimport o xjc para generar los artefactos necesarios para el cliente.
      Nota: Si quiere utilizar la especificación 2004/08 WS-Addressing, especifique el archivo de enlace proporcionado, raíz_servidor_aplicaciones/util/SubmissionEndpointReference.xjb, como el parámetro -b de la herramienta. Este parámetro indica a la herramienta que genere los objetos de referencia de punto final utilizando la clase SubmissionEndpointReference que forma parte de la implementación de IBM de la API JAX-WS estándar. Si no especifica este archivo de enlaces, los objetos de referencia de punto final resultantes no funcionarán con la API JAX-WS 2.1 estándar.
    2. En el código del cliente, cree una instancia de la clase de servicio.
    3. Obtenga el objeto proxy de la clase de servicio. Hay varias formas de utilizar la API JAX-WS para obtener los objetos de proxy. Por ejemplo, hay varios métodos getPort en la clase de servicio y uno en la clase EndpointReference. Para obtener más información, consulte la documentación de la API.
    4. Opcional: Utilice la característica Addressing o SubmissionAddressing para habilitar el soporte de WS-Addressing. Por ejemplo, cree un proxy utilizando un método getPort que acepte las características del servicio web como parámetro. Si lo prefiere, puede habilitar el soporte de WS-Addressing utilizando otro método, como conjuntos de políticas. Para obtener más información, consulte Habilitación de soporte de direccionamiento de servicios web para aplicaciones JAX-WS.
    5. Utilice el objeto proxy para invocar el método de servicio que devuelve la referencia de punto final.

    El código de ejemplo siguiente muestra un cliente invocando un servicio web para añadir dos números juntos. El servicio web emite un ticket (el identificador de recurso) al cliente, y precisa que el cliente utilice este ticket cuando se invoca el servicio web.

    El cliente crea dos proxies. El primero obtiene el ticket como referencia de punto final del servicio. El segundo proxy utiliza la clase AddressingFeature para habilitar WS-Addressing para la especificación 2005/08, e invoca el servicio para añadir los dos números juntos.
    ...
    CalculatorService service = new CalculatorService();
    // Crear el primer proxy
    Calculator port1 = service.getCalculatorServicePort();
    // Obtener el ticket como referencia de punto final del servicio
    W3CEndpointReference epr = port1.getTicket();
    
    // Crear el segundo proxy, utilizando una característica de direccionamiento para habilitar WS-Addressing
    Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
    // Invocar el servicio para añadir los números
    int answer = port2.add(value0, value1);
    System.out.println("The answer is: " + answer);
    ...
    Nota: Si los metadatos de la referencia de punto final entra en conflicto con la información que ya está asociada al mensaje de salida, por ejemplo si el objeto de proxy está configurado para representar una interfaz distinta, se lanza una excepción javax.xml.ws.WebServiceException al intentar invocar el punto final.
    Si quiere establecer las propiedades message-addressing (direccionamiento de mensajes), como una respuesta a un punto final, debe utilizar la SPI WS-Addressing propietaria de IBM y la clase BindingProvider, según se describe en Especificación y adquisición de las propiedades de direccionamiento de mensajes mediante el uso de las SPI de direccionamiento de servicios web propiedad de IBM.
  5. Opcional: Configure un cliente Dispatch para comunicar con el servicio. Puede configurar un cliente de distintas formas; los pasos siguientes describen un ejemplo.
    1. Cree una instancia del servicio.
    2. Añada un puerto al objeto de servicio.
    3. Cree una instancia de la clase Dispatch, pasando la referencia de punto final.
    4. Cree un objeto Dispatch. Utilice el método Service.createDispatch con los parámetros siguientes: Hay diversas variaciones del método Service.createDispatch; consulte la documentación de la API para obtener más detalles.
    5. Componga el mensaje de solicitud del cliente.
    6. Invoque el punto final de servicio con el cliente Dispatch.
    El código siguiente muestra un fragmento de ejemplo de un cliente Dispatch que habilita 2004/08 WS-Addressing.
    ...
    CalculatorService service = new CalculatorService();
    Dispatch(<SOAPMessage> dispatch = service.createDispatch(
        endpointReference,
        SOAPMessage.class,  
        Service.Mode.MESSAGE,  
        new SubmissionAddressingFeature(true));
    ...

Resultados

El cliente y el servicio web se configuran para utilizar referencias de punto final a través del soporte de WS-Addressing. Para obtener un ejemplo detallado que incluya código, consulte Ejemplo: creación de un servicio web que utiliza la API de direccionamiento de servicios web JAX-WS para acceder a una instancia de recursos de servicio web genérica.

Qué hacer a continuación


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wsa_rap_jaxws
File name: twbs_wsa_rap_jaxws.html