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
- 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.
- Implemente el servicio web creado en el paso anterior.
Para la parte WS-Addressing de la implementación, realice los pasos siguientes:
- Opcional: Incluya anotaciones para especificar el comportamiento de
WS-Addressing. Consulte
Anotaciones de direccionamiento de servicios web
para obtener más detalles.
- Opcional: Si la interfaz implica un servicio web que atiende una instancia
de recurso, cree o busque la instancia de recurso.
- 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.
- 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.
- Vuelva a la referencia del punto final.
- 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:
- 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);
...
- Reenvíe el mensaje a la instancia de recurso adecuada.
- Opcional: Configure un cliente proxy para comunicar con el servicio.
- 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.
- En el código del cliente, cree una instancia de la clase de servicio.
- 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.
- 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.
- 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.
- Opcional: Configure un cliente Dispatch para comunicar con el
servicio. Puede configurar un cliente de distintas formas; los pasos siguientes describen un ejemplo.
- Cree una instancia del servicio.
- Añada un puerto al objeto de servicio.
- Cree una instancia de la clase Dispatch, pasando la referencia de punto final.
- 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.
- Componga el mensaje de solicitud del cliente.
- 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));
...