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 in
WebSphere Application Server ausgeführt werden.
Informationen zu diesem Vorgang
Führen Sie diese Task aus, wenn Sie einen JAX-WS-Web-Service erstellen, der die Spezifikation
"WS-Addressing" verwendet. In dieser Task werden die WS-Addressing-Anwendungsprogrammierschnittstellen (API, Application Programming Interface) von JAX-WS
verwendet, um die erforderliche Endpunktreferenz zu erstellen. Alternativ dazu können Sie Endpunktreferenzen mit der
IBM proprietären WS-Addressing-API erstellen und sie in API-Objekte von JAX-WS konvertieren, damit sie
auch in der restlichen Anwendung verwendet werden können.
Vorgehensweise
- Stellen Sie eine Web-Service-Schnittstelle bereit, die eine Endpunktreferenz an den Zielservice zurückgibt.
Die Schnittstelle muss eine Endpunktreferenz zurückgeben. Hierfür kann sie eine Factory-Operation oder einen
separaten Factoryservice verwenden. Der Zielservice kann einer Ressourceninstanz vorangestellt sein,
z. B. ein elektronischer Warenkorb.
- Implementieren Sie den Web-Service, den Sie im vorherigen Schritt erstellt haben. Führen Sie für den
WS-Addressing-Teil der Implementierung die folgenden Schritte aus:
- Optional: Schließen Sie Annotationen ein, um das WS-Addressing-Verhalten zu spezifizieren.
Weitere Einzelheiten finden Sie im Artikel WS-Addressing-Annotationen.
- Optional: Wenn Ihre Schnittstelle einen Web-Service umfasst, der einer
Ressourceninstanz vorangestellt ist, erstellen oder ermitteln Sie die Ressourceninstanz.
- Optional: Wenn Sie eine Ressourceninstanz verwenden, rufen Sie die Kennung der Ressource ab. Die Ressourcen-ID ist anwendungsabhängig und kann während der Erstellung der Ressourceninstanz generiert werden.
Achtung: Fügen Sie keine sensiblen Informationen in die Ressourcen-ID ein, da die ID in der SOAP-Nachricht weitergegeben wird.
- Erstellen Sie eine Endpunktreferenz, die auf den Web-Service verweist. Folgen Sie dazu den Anweisungen
im Artikel Endpunktreferenzen über die WS-Adressing-API von JAX-WS erstellen. Wenn Sie eine Ressourceninstanz verwenden, übergeben Sie die Ressourcenkennung als Parameter.
- Geben Sie die Endpunktreferenz zurück.
- Wenn Ihr Web-Service Ressourceninstanzen verwendet, erweitern Sie die Implementierung so, dass eingehende
Nachrichten den entsprechenden Ressourceninstanzen zugeordnet werden. Da Sie die Ressourcen-ID der zuvor erstellten Endpunktreferenz zugeordnet haben,
enthalten alle eingehenden Nachrichten für diese Endpunktreferenz die Informationen zur Ressourcen-ID
als Referenzparameter im SOAP-Header der Nachricht.
Da die Ressourcen-ID im SOAP-Header übergeben wird, müssen Sie sie nicht in der Web-Service-Schnittstelle
offen legen.
Wenn WebSphere Application Server die Nachricht empfängt, werden diese Informationen in den Nachrichtenkontext des Threads kopiert.
Erweitern Sie die Implementierung, um die folgenden Aktionen auszuführen:
- Rufen Sie die Kennung der Ressourceninstanz aus dem Nachrichtenkontext ab.
- Wenn Sie den WS-Addressing-Namespace der Spezifikation vom August 2005 verwenden, verwenden Sie die Eigenschaft REFERENCE_PARAMETERS
der Klasse "MessageContext".
- Wenn Sie den WS-Addressing-Namespace der Spezifikation vom August 2004 verwenden, müssen Sie die
IBM WS-Addressing-API verwenden, insbesondere die Methode "EndpointReferenceManager.getReferenceParameterFrom
MessageContext(QName resource_id)".
Verwenden Sie die folgende Methode für den WS-Addressing-Namespace der Spezifikation vom August 2005:
...
List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
...
Verwenden Sie die folgende Methode für den WS-Addressing-Namespace der Spezifikation vom August 2004:
...
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);...
- Leiten Sie die Nachricht an die entsprechende Ressourceninstanz weiter.
- Optional: Konfigurieren Sie einen Proxy-Client für die Kommunikation mit dem Service.
- Verwenden Sie das Tool "wsimport" oder "xjc", um die für den Client erforderlichen Artefakte zu erstellen.
Anmerkung: Wenn Sie die WS-Addressing-Spezifikation vom August 2004 verwenden möchten, geben Sie die bereitgestellte
Bindungsdatei "Stammverzeichnis_des_Anwendungsservers/util/SubmissionEndpointReference.xjb"
mit dem Parameter "-b" des Tools an. Dieser Parameter weist das Tool an, Endpunktreferenzobjekte über die Klasse
"SubmissionEndpointReference" zu generieren, die zur IBM Implementierung der Standard-APIs von JAX-WS gehört.
Wenn Sie diese Bindungsdatei nicht angeben, funktionieren die generierten Endpunktreferenzobjekte nicht
mit der Standard-API von JAX-WS.
- Erstellen Sie im Clientcode eine Instanz der Serviceklasse.
- Rufen Sie ein Proxy-Objekt von der Serviceklasse ab. Proxy-Objekte können auf verschiedene Arten über die Anwendungsprogrammierschnittstelle von JAX-WS abgerufen werden. Es gibt beispielsweise mehrere getPort-Methoden in der Klasse "Service" und eine in der Klasse "EndpointReference".
Weitere Informationen finden Sie in der API-Dokumentation.
- Optional: Verwenden Sie das Feature "Addressing" oder "SubmissionAddressing", um die
WS-Addressing-Unterstützung zu aktivieren. Erstellen Sie beispielsweise einen Proxy über eine Methode "getPort", die Web-Service-Features als Parameter akzeptiert.
Wenn Sie möchten, können Sie die WS-Addressing-Unterstützung auch mit einer anderen Methode, z. B. mit Richtliniensätzen,
aktivieren.
Weitere Informationen finden Sie im Artikel WS-Addressing-Unterstützung für JAX-WS-Anwendungen aktivieren.
- Verwenden Sie das Proxy-Objekt, um die Servicemethode aufzurufen, die die Endpunktreferenz zurückgibt.
Der folgende Beispielcode zeigt einen Client, der einen Web-Service aufruft, um zwei Zahlen zu addieren.
Der Web-Service setzt ein Ticket (die Ressourcenkennung) an den Client ab und fordert den Client auf, dieses Ticket beim Aufrufen des Web-Service zu verwenden.
Der Client erstellt zwei Proxys. Der erste Proxy ruft das Ticket als Endpunktreferenz vom Service ab.
Der zweite Proxy verwendet die Klasse "AddressingFeature", um WS-Addressing für die Spezifikation vom August 2005
zu aktivieren, und ruft den Service auf, um die beiden Zahlen zu addieren.
...
CalculatorService service = new CalculatorService();
// Ersten Proxy erstellen
Calculator port1 = service.getCalculatorServicePort();
// Ticket als Endpunktreferenz vom Service abrufen
W3CEndpointReference epr = port1.getTicket();
// Zweiten Proxy über ein Adressierungfeature erstellen, das WS-Addressing aktiviert
Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
// Service zum Addieren der Zahlen aufrufen
int answer = port2.add(value0, value1);
System.out.println("The answer is: " + answer);
...
Anmerkung: Wenn die Metadaten der Endpunktreferenz mit den Informationen
in Konflikt steht, die der abgehenden Nachricht bereit zugeordnet sind (z. B., wenn das Proxy-Objekt
eine andere Schnittstelle darstellen soll), wird eine Ausnahme des Typs
"javax.xml.ws.WebServiceException" ausgelöst, wenn versucht wird, den Endpunkt aufzurufen.
Wen Sie Eigenschaften für die Nachrichtenadressierung definieren möchten, z. B. einen Endpunkt für Antworten,
müssen Sie die IBM proprietäre Systemprogrammierschnittstelle (SPI, System Programming Interface) und die Klasse "BindingProvider" verwenden, wie im Artikel
Eigenschaften für die Nachrichtenadressierung mit den IBM proprietären Web-Services-Addressing-SPIs angeben und abrufen beschrieben ist.
- Optional: Konfigurieren Sie einen Dispatch-Client für die Kommunikation mit dem Service. Sie können einen Client auf verschiedene Arten konfigurieren. In den folgenden Schritten ist eine davon beschrieben:
- Erstellen Sie eine Instanz des Service.
- Fügen Sie dem Serviceobjekt einen Port hinzu.
- Erstellen Sie eine Instanz der Klasse "Dispatch", und übergeben Sie die Endpunktreferenz.
- Erstellen Sie ein Dispatch-Objekt. Verwenden Sie die Methode "Service.createDispatch" mit den folgenden Parametern:
- Die vom Service zurückgegebene Endpunktreferenz, die die Ressource darstellt, an die Nachrichten weitergeleitet werden.
- Ein Bereich von Web-Service-Features. Schließen Sie ein oder mehrere WS-Addressing-Features ein, um
WS-Addressing zu aktivieren. Weitere Einzelheiten finden Sie im Artikel WS-Addressing-Unterstützung für JAX-WS-Anwendungen aktivieren.
Es gibt mehrere Varianten der Methode "Service.createDispatch2. Weitere Einzelheiten finden Sie in der API-Dokumentation.
- Erstellen Sie die Clientanforderungsnachricht.
- Rufen Sie den Serviceendpunkt mit dem Dispatch-Client auf.
Der folgende Code zeigt ein Beispielfragment eines Dispatch-Clients, der die WS-Addressing-Spezifikation vom
August 2004 aktiviert. ...
CalculatorService service = new CalculatorService();
Dispatch(<SOAPMessage> dispatch = service.createDispatch(
endpointReference,
SOAPMessage.class,
Service.Mode.MESSAGE,
new SubmissionAddressingFeature(true));
...
Nächste Schritte
- Informationen zur Sicherheit mit WS-Addressing finden Sie im Artikel Sicherheit in Web Services Addressing.
- Implementieren Sie die Anwendung. Wenn Sie WS-Addressing-Annotationen oder -Features im Code
verwendet haben, müssen Sie zum Aktivieren der WS-Addressing-Unterstützung keine weiteren Schritte ausführen.
Weitere Informationen und weitere Szenarien, die die Ausführung weiterer Schritte erfordern, z. B. die Aktivierung der
WS-Addressing-Unterstützung über Richtliniensätze, finden Sie im Artikel WS-Addressing-Unterstützung für JAX-WS-Anwendungen aktivieren.