JAX-RPC-Web-Service-Anwendung erstellen, die Web Services Addressing verwendet
Web Services Addressing (WS-Addressing) unterstützt die Interoperabilität zwischen Web-Services, indem es eine Standardmethode für die Adressierung von Web-Services definiert und in Nachrichten Adressierungsinformationen bereitstellt. Diese Task beschreibt die Schritte, die ausgeführt werden müssen, um einen Web-Service zu erstellen, auf den über eine WS-Addressing-Endpunktreferenz zugegriffen wird. Die Task beschreibt außerdem die zusätzlichen Schritte, die ausgeführt werden müssen, um statusabhängige Ressourcen in einem Web-Service zu verwenden.
Vorbereitende Schritte
Die in dieser Task beschriebenen Schritte gelten für Server und Clients, die unter WebSphere Application Server ausgeführt werden.
Informationen zu diesem Vorgang
Führen Sie diese Task aus, wenn Sie einen Web-Service erstellen möchten, der die Spezifikation "WS-Addressing" verwendet.
Vorgehensweise
Ergebnisse
Eine Web-Service-Schnittstelle bereitstellen, die eine Endpunktreferenz auf den Zielservice zurückgibt
Die folgenden Beispiele entsprechen den Schritten 1 bis 4 in der Prozedur. Die Beispiele veranschaulichen, wie eine IT-Organisation Web-Services verwenden kann, um ein Druckernetz zu verwalten. Die Abteilung kann jeden Drucker als Ressource darstellen, die über eine Endpunktreferenz adressiert wird. Die folgenden Beispiele zeigen, wie ein solcher Service mit den IBM proprietären Abwendungsprogrammierschnittstellen für Web Services Addressing (WS-Addressing), die von WebSphere Application Server und JAX-WS bereitgestellt werden, codiert wird.
Die IT-Organisation implementiert einen PrinterFactory-Service, der ein CreatePrinter-Element "portType" anbietet. Dieses Element "portType" akzeptiert eine CreatePrinterRequest-Nachricht, um eine Ressource zu erstellen, die einen logischen Drucker darstellt, und antwortet mit einer Endpunktreferenz, die eine Referenz auf die Ressource ist.
<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>
Die Operation "CreatePrinter" im vorherigen Beispiel gibt ein Objekt "wsa:EndpointReference" zurück, das die neu erstellte Printer-Ressource darstellt. Der Client kann diese Endpunktreferenz verwenden, um Nachrichten an die Serviceinstanz zu senden, die den Drucker darstellt.
Die im folgenden Beispiel gezeigte Methode "createPrinter" erstellt eine Endpunktreferenz auf den Service "Printer". Anschließend ruft die Operation die ID der jeweiligen Druckerressourceninstanz ab und ordnet sie der Endpunktreferenz zu. Die Methode "createPrinter" konvertiert das EndpointReference-Objekt, das jetzt den neuen Drucker darstellt, in ein W3CEndpointReference-Objekt und gibt die konvertierte Endpunktreferenz zurück.
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 {
// Drucker erstellen
...
// Druckerressourcen-ID als statischen Inhalt definiert, weil dies in späteren Schritten erforderlich ist
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 {
// Eine Endpunktreferenz mit dem URI und Portnamen des entsprechenden Web-Service erstellen
EndpointReference epr = EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME,
PRINTER_ENDPOINT_NAME);
// Die statusabhängige Ressource erstellen oder suchen und eine Zeichenfolge für die
// Ressourcen-ID ableiten
String resource_identifier = "...";
// Diese Ressourcen-ID der Endpunktreferenz als
// Referenzparameter zuordnen.
// Es kann ein beliebiger Name ausgewählt werden. Er sollte
// jedoch für den Service eindeutig sein.
epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
// Die Endpunktreferenz verweist jetzt auf die Ressource und nicht auf den Service.
...
return EndpointReferenceConverter.createW3CEndpointReference(epr);
}
}
Aufgrund der zuvor beschriebenen Web-Service-Implementierung hat die Druckerressourceninstanz jetzt eine eindeutige ID, die in die zugehörige Endpunktreferenz integriert wird. Diese ID erscheint als Referenzparameter im SOAP-Header nachfolgender Nachrichten für den Web-Service und kann vom Web-Service verwendet werden, um eingehende Nachrichten dem entsprechenden Drucker zuzuordnen.
Wenn ein Web-Service eine Nachricht empfängt, die WS-Addressing-Eigenschaften für die Nachrichtenadressierung enthält, verarbeitet WebSphere Application Server diese Eigenschaften, bevor die Nachricht an den Anwendungsendpunkt gesendet wird, und legt sie im Nachrichtenkontext im Thread fest. Die Web-Service-Anwendung "Printer" greift, wie im folgenden Beispiel gezeigt, über das Objekt "WebServiceContext" auf die Referenzparameter zu, die dem Zielendpunkt zugeordnet sind:
import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
...
// Referenzparameter initialisieren
QName name = new QName(..);
// Zeichenfolgewert extrahieren
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
Die Web-Service-Implementierung kann Nachrichten basierend auf der Drucker-ID, die über die Methode "getReferenceParameterFromMessageContext" abgerufen wird, an die entsprechenden Druckerinstanzen weiterleiten.
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;
// Anforderungskontext für das BindingProvider-Objekt abrufen
Map myMap = myBindingProvider.getRequestContext();
// Endpunktreferenz, die den neuen Drucker darstellt, dem Anforderungskontext zuordnen, damit
// das BindingProvider-Objekt jetzt eine bestimmte Druckerinstanz darstellt.
myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);
...
Das BindingProvider-Objekt stellt jetzt die neue Druckerressourceninstanz dar und kann vom Client verwendet werden, um Nachrichten
über den Web-Service "Printer" an den Drucker zu senden.
Wenn der Client das BindingProvider-Objekt aufruft, fügt WebSphere Application Server die
erforderlichen Nachrichtenadressierungseigenschaften zum Nachrichtenheader hinzu.
Dies ist in diesem Fall ein Referenzparameter, der in der Endpunktreferenz enthalten ist, die die Zieldruckerressource
angibt.Alternativ kann der Client ein JAX-RPC-Stub- oder -Call-Objekt verwenden, das der Client mit dem neuen Drucker konfiguriert: Die Verwendung des Call-Objekts wird im folgenden Beispiel veranschaulicht.
import javax.xml.rpc.Call;
...
:
// Endpunktreferenz, die den neuen Drucker darstellt, dem Call-Objekt zuordnen.
call.setProperty(
"com.ibm.websphere.wsaddressing.WSAConstants.
WSADDRESSING_DESTINATION_EPR ", epr);
Aus der Perspektive des Clients ist die Endpunktreferenz nicht transparent. Der Client kann den Inhalt von Endpunktreferenzparametern nicht interpretieren und sollte von jeglicher Verwendung dieser Parameter Abstand nehmen. Clients können Instanzen von Endpunktreferenzen nicht direkt erstellen, weil die Referenzparameter private Parameter des Service-Providers sind. Clients müssen Endpunktreferenzen vom Service-Provider abrufen, z. B. über einen Providerfactoryservice, und sie anschließend verwenden, um Web-Service-Operationen an den von der Endpunktreferenz dargestellten Endpunkt weiterzuleiten.
Nächste Schritte
- Informationen zur Sicherheit mit WS-Addressing finden Sie im Artikel Sicherheit in Web Services Addressing.
- Implementieren Sie die Anwendung. Für dieses Szenario müssen Sie keine weiteren Schritte ausführen, um die WS-Addressing-Unterstützung in WebSphere Application Server zu aktivieren, weil Sie eine WS-Addressing-Eigenschaft im Client angegeben haben. Weitere Informationen und Beschreibungen weiterer Szenarien, in denen zusätzliche Schritte erforderlich sein können, finden Sie im Artikel WS-Addressing-Unterstützung für JAX-RPC-Anwendungen aktivieren.