Creación de una aplicación de servicio web JAX-RPC que utiliza el 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-RPC al que se accede a través de 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 que utiliza la especificación WS-Addressing.
Procedimiento
Resultados
Cómo proporcionar una interfaz de servicio web que devuelva una referencia de punto final al servicio de destino
Los ejemplos siguientes corresponden a los pasos 1 a 4 del procedimiento. Los ejemplos muestran cómo una organización de TI puede utilizar los servicios web para gestionar una red de impresoras. Es posible que la organización represente cada impresora como un recurso que se direcciona a través de una referencia de punto final. Los siguientes ejemplos muestran cómo codificar dicho servicio utilizando las interfaces de programación de aplicaciones (API) de Web Services Addressing (WS-Addressing) propiedad de IBM proporcionadas por WebSphere Application Server y JAX-WS.
La organización de TI implementa un servicio PrinterFactory que ofrece un elemento portType de CreatePrinter. Este elemento portType acepta un mensaje CreatePrinterRequest para crear un recurso que representa una impresora lógica y responde con una referencia de punto final que es una referencia al recurso.
<wsdl:definitions targetNamespace="http://example.org/printer" ...
xmlns:pr=" http://example.org/printer">
<wsdl:types>
...
<xsd:schema...>
<xsd:element name="CreatePrinterRequest"/>
<xsd:element name="CreatePrinterResponse"
type="wsa:EndpointReferenceType"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="CreatePrinterRequest">
<wsdl:part name="CreatePrinterRequest"
element="pr:CreatePrinterRequest" />
</wsdl:message>
<wsdl:message name="CreatePrinterResponse">
<wsdl:part name="CreatePrinterResponse"
element="pr:CreatePrinterResponse" />
</wsdl:message>
<wsdl:portType name="CreatePrinter">
<wsdl:operation name="createPrinter">
<wsdl:input name="CreatePrinterRequest"
message="pr:CreatePrinterRequest" />
<wsdl:output name="CreatePrinterResponse"
message="pr:CreatePrinterResponse" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
La operación CreatePrinter del ejemplo anterior devuelve un objeto wsa:EndpointReference que representa el recurso de impresora recién creado. El cliente puede utilizar esta referencia de punto final para enviar mensajes a la instancia de servicio que representa la impresora.
El método createPrinter mostrado en el ejemplo siguiente crea una referencia de punto final al servicio Printer. Entonces la operación obtiene el identificador de la instancia de recurso de impresora individual y lo asocia con la referencia de punto final. Por último, el método createPrinter convierte el objeto EndpointReference, que ahora representa la nueva impresora, en un objeto W3CEndpointReference, y devuelve la referencia de punto final convertida.
import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
import com.ibm.websphere.wsaddressing.EndpointReference;
import com.ibm.websphere.wsaddressing.jaxws.EndpointReferenceConverter;
import com.ibm.websphere.wsaddressing.jaxws.W3CEndpointReference;
import javax.xml.namespace.QName;
public class MyClass {
// Crear la impresora
...
// Definir el ID de recurso de impresora como constante estática tal como se necesita en pasos posteriores
public static final QName PRINTER_ID_PARAM_QNAME = new QName("example.printersample",
"IBM_WSRF_PRINTERID", "ws-rf-pr" );
public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "...");
public static final String PRINTER_ENDPOINT_NAME = new String("PrinterService");
public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
throws Exception {
// Crear una EndpointReference destinado al URI WebService y al nombre de puerto apropiados.
EndpointReference epr = EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME,
PRINTER_ENDPOINT_NAME);
// Crear o buscar el recurso con estado y derivar una
// serie de identificador de recurso.
String resource_identifier = "...";
// Asociar este identificador de recurso con EndpointReference como
// parámetro de referencia.
// La elección de nombre es arbitraria, pero debe ser exclusiva
// para el servicio.
epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
// Ahora la referencia de punto final está destinada al recurso en lugar del servicio.
...
return EndpointReferenceConverter.createW3CEndpointReference(epr);
}
}
Debido a la implementación de servicio web descrita anteriormente, la instancia de recurso de impresora tiene ahora un identificador exclusivo incorporado en la referencia de punto final. Este identificador se convierte en un parámetro de referencia en la cabecera SOAP de los mensajes subsiguientes destinados al servicio web y el servicio web lo puede utilizar para comparar los mensajes de entrada con la impresora apropiada.
Cuando un servicio web recibe un mensaje que contiene propiedades de direccionamiento de mensajes de WS-Addressing, WebSphere Application Server las procesa antes de que se asigne el mensaje al punto final de aplicación y las establece en el contexto de mensaje de la hebra. La aplicación de servicio web de impresora accede a los parámetros de referencia asociados con el punto final de destino desde el objeto WebServiceContext, como se ilustra más abajo:
import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
...
// Inicializar el nombre de parámetro de referencia
QName name = new QName(..);
// Extraer el valor de String.
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
La implementación de servicio web puede reenviar mensajes basándose en la identidad de impresora adquirida en el método getReferenceParameterFromMessageContext a las instancias de impresora apropiadas.
import javax.xml.ws.BindingProvider;
...
javax.xml.ws.Service service= ...;
Printer myPrinterProxy = service.getPort(portName, Printer.class);
javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider)myPrinterProxy;
// Recuperar el contexto de solicitud para el objeto BindingProvider
Map myMap = myBindingProvider.getRequestContext();
// Asociar la referencia de punto final que representa la nueva impresora con el contexto de solicitud
// de modo que el objeto ahora BindingProvider representa una instancia de impresora específica.
myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);
...
Ahora el objeto BindingProvider representa la nueva
instancia de recurso de impresora y el cliente lo puede utilizar para
enviar mensajes a la impresora mediante el servicio web de impresora. Cuando el cliente invoca el objeto BindingProvider, WebSphere Application Server añade las propiedades de direccionamiento de mensaje apropiadas a la cabecera de mensaje, en este caso se trata de un parámetro de referencia contenido en la referencia de punto final que identifica el recurso de impresora de destino.De forma alternativa, el cliente puede utilizar un objeto JAX-RPC Stub o Call, que el cliente configura para representar la nueva impresora. El uso del objeto Call se ilustra en el ejemplo siguiente.
import javax.xml.rpc.Call;
...
:
// Asociar la referencia de punto final que representa la nueva impresora con la llamada.
call.setProperty(
"com.ibm.websphere.wsaddressing.WSAConstants.
WSADDRESSING_DESTINATION_EPR ", epr);
Desde la perspectiva del cliente, la referencia de punto final es opaca. El cliente no puede interpretar el contenido de los parámetros de referencia de punto final y no debe intentar utilizarlos de ningún modo. Los clientes no pueden crear directamente instancias de referencias de punto final ya que los parámetros de referencia son privados para el proveedor de servicios; los clientes deben obtener las referencias de punto final del proveedor de servicios, como, por ejemplo, mediante un servicio de fábrica de proveedor y, a continuación, utilizarlas para dirigir las operaciones de servicio web al punto final representado por la referencia de punto final, tal como se muestra.
Qué hacer a continuación
- Consulte Seguridad sobre Web Services Addressing, si desea información sobre la seguridad con WS-Addressing.
- Despliegue la aplicación. Para este caso de ejemplo, no tiene que realizar pasos adicionales para habilitar el soporte de WS-Addressing en WebSphere Application Server, puesto que ha especificado una propiedad WS-Addressing en el cliente. Si desea más información y para obtener otros casos de ejemplo que podrían requerir pasos adicionales, consulte Habilitación del soporte de Web Services Addressing para aplicaciones JAX-RPC.