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

  1. Stellen Sie durch Erstellen oder Generieren eines WSDL-Dokuments für den Web-Service eine Web-Service-Schnittstelle bereit, die eine Endpunktreferenz auf den Zielservice zurückgibt. Die Schnittstelle muss eine Endpunktreferenz zurückgeben. Hierfür kann sie eine Factoryoperation oder einen separaten Factoryservice verwenden. Der Zielservice kann einer Ressourceninstanz vorangestellt sein, z. B. ein elektronischer Warenkorb.
  2. 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:
    1. Erstellen Sie eine Endpunktreferenz, die auf den Web-Service verweist. Folgen Sie dazu den Anweisungen im Artikel Endpunktreferenzen über die IBM proprietäre Web-Services-Addressing-API erstellen.
    2. Optional: Wenn Ihre Schnittstelle einen Web-Service umfasst, der einer Ressourceninstanz vorangestellt ist, erstellen oder ermitteln Sie die Ressourceninstanz.
    3. Optional: Wenn Sie eine Ressourceninstanz verwenden, rufen Sie die ID der Ressource ab, und ordnen Sie sie der Endpunktreferenz mit der Methode "EndpointReference.setReferenceParameter(QName resource_id_name, String value)" als Referenzparameter zu. 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.
      Die Endpunktreferenz verweist jetzt auf die Ressource.
    4. Geben Sie die Endpunktreferenz zurück.
  3. 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:
    1. Rufen Sie die ID der Ressourceninstanz mit der Methode "EndpointReferenceManager.getReferenceParameterFromMessageContext(QName resource_id_name)" aus dem Nachrichtenkontext ab.
    2. Leiten Sie die Nachricht an die entsprechende Ressourceninstanz weiter.
  4. Wenn Sie einen Client für die Kommunikation mit dem Service konfigurieren möchten, verwenden Sie die vom Service im ersten Schritt erzeugte Endpunktreferenz, um Nachrichten an den Endpunkt zu senden.
    1. Rufen Sie ein Stub-Objekt ab (indem Sie den Service in Java™ Naming and Directory Interface (JNDI) suchen), oder erstellen Sie ein leeres Call-Objekt.
    2. Ordnen Sie die Endpunktreferenz dem Proxy-Objekt zu. Verwenden Sie die Methode "setProperty(String property_name, Object value)" des Stub- oder Call-Objekts. Verwenden Sie die WS-Addressing-Konstante SADDRESSING_DESTINATION_EPR als Eigenschaftsnamen und die Endpunktreferenz als Wert.
      Diese Prozedur konfiguriert automatisch den BindingProvider-Anforderungskontext oder das Stub- bzw. Call-Objekt, um den Web-Service (oder die Ressourceninstanz, falls Ihre Schnittstelle einen Web-Service verwendet, der einer Ressourceninstanz vorangestellt ist) der Endpunktreferenz darzustellen. Für Call-Objekte umfasst dieser Prozess die Konfiguration der Schnittstelle und Endpunktmetadaten (Elemente portType und port), die der Endpunktreferenz zugeordnet sind.
      Anmerkung: Wenn die Metadaten der Endpunktreferenz mit den Informationen in Konflikt steht, die der abgehenden Nachricht bereit zugeordnet sind (z. B., wenn das Stub-Objekt eine andere Schnittstelle darstellen soll), wird eine Ausnahme des Typs "javax.xml.rpc.JAXRPCException" ausgelöst, wenn versucht wird, den Endpunkt aufzurufen.

    Aufrufe des Stub- bzw. Call-Objekts werden jetzt an den Web-Service bzw. die Ressourceninstanz weitergeleitet, der bzw. die in der Endpunktreferenz definiert ist. Bei einem Aufruf fügt das Produkt entsprechende Eigenschaften für die Nachrichtenadressierung, z. B. einen Referenzparameter, der in der Endpunktreferenz enthalten ist und eine Zielressource angibt, dem Nachrichtenheader hinzu.

Ergebnisse

Der Web-Service und der Client sind jetzt so konfiguriert, dass sie Endpunktreferenzen über die WS-Addressing-Unterstützung verwenden.

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.

Die WSDL-Definition für einen solchen PrinterFactory-Service könnte den folgenden Code enthalten:
<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.

Der Client erstellt einen JAX-WS-Proxy für den Drucker und konvertiert den Proxy in ein BindingProvider-Objekt. Anschließend ordnet der Client das zuvor abgerufene EndpointReference-Objekt dem Anforderungskontext des BindingProvider-Objekts zu. Sehen Sie sich dazu das folgende Beispiel an:
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.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wsa_rap
Dateiname:twbs_wsa_rap.html