JAX-WS
Java™ API for XML-Based Web Services (JAX-WS) ist das Web-Service-Programmiermodell der nächsten Generation, das vom Programmiermodell Java API for XML-based RPC (JAX-RPC) bereitgestellte Grundlage ergänzt. JAX-WS vereinfacht die Entwicklung von Web-Services und -Clients und bietet Java-Anwendungen durch die Verwendung von dynamischen Proxys und Java-Annotationen eine größere Plattformunabhängigkeit.
JAX-WS ist ein Programmiermodell, das die Anwendungsentwicklung durch die Unterstützung eines standardisierten und annotationsbasierten Modells für die Entwicklung von Web-Service-Anwendungen und -Clients vereinfacht. Die JAX-WS-Technologie ist strategisch an dem aktuellen Branchentrend eines eher dokumentationsorientierten Messaging-Modells ausgerichtet und ersetzt das Programmiermodell für Fernprozeduraufrufe, das in JAX-RPC definiert ist. Obwohl JAX-RPC-Programmiermodell und JAX-RPC-Anwendungen weiterhin von diesem Produkt unterstützt werden, weist JAX-RPC Einschränkungen auf und unterstützt verschiedene komplexe dokumentationsorientierte Services nicht. JAX-WS ist das strategische Programmiermodell für die Entwicklung von Web-Services und erforderlicher Teil von Java Platform, Enterprise Edition 6 (Java EE 6). JAX-WS ist auch unter der Bezeichnung JSR 224 bekannt.
Die Spezifikation JAX-WS 2.2 beinhaltet die Funktionen der Spezifikation JAX-WS 2.1 und übertrifft diese. JAX-WS 2.2 bietet jetzt eine clientseitige Unterstützung für die Nutzung von Annotationen hinsichtlich WebServiceFeature, wie z. B. @MTOM, @Addressing, und die @RespectBinding-Annotationen. JAX-WS 2.1 hatte zuvor Unterstützung für diese Annotationen auf dem Server bereitgestellt. Sie können die WS-Addressing-Unterstützung für einen Client oder Service aktivieren und konfigurieren, indem Sie WS-Policy-Zusicherungen zum WSDL-Dokument hinzufügen. Die Spezifikation Web Services for Java EE 1.3 bietet jetzt zusätzlich Unterstützung für diese Annotationen bezüglich WebServiceFeature und unterstützt außerdem die Nutzung von Implementierungsdeskriptorelementen zur Konfiguration auf Client und Server. JAX-WS 2.2 erfordert Java Architecture for XML Binding (JAXB) Version 2.2 für die Datenbindung.
Die Implementierung des Programmierstandards JAX-WS stellt die folgenden Erweiterungen für die Entwicklung von Web-Services und -Clients bereit:
- Bessere Plattformunabhängigkeit für Java-Anwendungen.
Die Verwendung der JAX-WS-APIs vereinfacht die Entwicklung von Web-Services und -Clients und bietet eine größere Plattformunabhängigkeit für Java-Anwendungen. JAX-WS nutzt den Mechanismus für dynamische Proxys, um ein formales Delegierungsmodell mit einem Plug-in-Provider bereitzustellen. Dies ist eine Verbesserung im Vergleich mit JAX-RPC, das sich auf die Generierung anbieterspezifischer Stubs für den Aufruf stützt.
- Annotationen
JAX-WS führt die Unterstützung für die Annotation von Java-Klassen mit Metadaten ein, um anzuzeigen, dass es sich bei der Java-Klasse um einen Web-Service handelt. JAX-WS unterstützt die Verwendung von Annotationen auf der Basis der Spezifikationen Metadata Facility for the Java Programming Language (JSR 175), Web Services Metadata for the Java Platform (JSR 181) und JAX-WS 2.2. Die Verwendung von Annotationen in der Java-Quelle und in der Java-Klasse vereinfacht die Entwicklung von Web-Services. Verwenden Sie Annotationen, um Informationen zu definieren, die gewöhnlich aus den Implementierungsdeskriptordateien, WSDL-Dateien oder Zuordnungsmetadaten aus XML- und WSDL-Dateien in die Quellenartefakte abgerufen werden.
Beispielsweise können Sie ein einfaches Tag @WebService in die Java-Quelle einbetten, um die Bean als Web-Service bereitzustellen.
Die Annotation "@WebService" weist die Laufzeitumgebung des Servers an, alle öffentlichen Methoden in dieser Bean als Web-Service bereitzustellen. Eine differenziertere Steuerung ist möglich, indem einzelnen Methoden oder Parametern weitere Annotationen hinzugefügt werden. Mit Annotationen ist die Bereitstellung von Java-Artefakten als Web-Services sehr viel einfacher. Wenn Artefakte über die Verwendung von Top-down-Zuordnungstools ausgehend von einer WSDL-Datei erstellt werden, werden Annotationen in die Quelle und die Java-Klassen eingefügt, um die Metadaten zusammen mit den Quellendateien zu erfassen.@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
Die Verwendung von Annotationen vereinfacht auch die Entwicklung von Web-Services in einer Teamstruktur, weil Sie nicht jeden Web-Service in einem einzelnen oder allgemeine Implementierungsdeskriptor definieren müssen, wie es bei JAX-RPC-Web-Services erforderlich ist. Die Nutzung von Annotationen bei JAX-WS-Web-Services ermöglicht die parallele Entwicklung des Service und der erforderlichen Metadaten.
Für JAX-WS-Web-Services ist die Verwendung des Implementierungsdeskriptors webservices.xml optional, weil Sie Annotationen verwenden können, um alle Informationen anzugeben, die in der Implementierungsdeskriptordatei enthalten sind. Sie können die Implementierungsdeskriptordatei verwenden, um vorhandene JAX-WS-Annotationen zu erweitern oder zu überschreiben. Alle Informationen, die Sie im Implementierungsdeskriptor webservices.xml definieren, überschreiben die entsprechenden Informationen, die in Annotationen angegeben sind.
Beispiel: Angenommen, die Serviceimplementierungsklasse für Ihren JAX-WS-Web-Service enthält Folgendes:- die Annotation "@WebService":
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- die Datei webservices.xml legt wie folgt
einen anderen Dateinamen für das WSDL-Dokument fest:
<webservices> <webservice-description> <webservice-description-name>ExampleService</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- die Annotation "@WebService":
- Web-Services asynchron aufrufen
Bei JAX-WS werden Web-Services synchron und asynchron aufgerufen. JAX-WS unterstützt beim asynchronen Aufruf von Web-Services sowohl den Abfrage- als auch den Callback-Mechanismus. Wenn ein Abfragemodell verwendet wird, kann ein Client eine Anforderung absetzen und ein Antwortobjekt empfangen, das dann abgefragt wird, um festzustellen, ob der Server geantwortet hat. Wenn der Server antwortet, wird die tatsächliche Antwort abgerufen. Bei der Verwendung eines Callback-Modells stellt der Client einen Callback-Handler bereit, der das eingehende Antwortobjekt akzeptiert und verarbeitet. Sowohl beim Abfrage- als auch beim Callback-Modell kann sich der Client auf die weitere Verarbeitung von Anforderungen konzentrieren, ohne auf die Rückgabe einer Antwort zu warten. Deshalb bieten diese beiden Modelle eine dynamischere und effizientere Methode zum Aufrufen von Web-Services.
Eine Web-Service-Schnittstelle kann beispielsweise Methoden für synchrone und asynchrone Anforderungen enthalten. Asynchrone Anforderungen sind im folgenden Beispiel an der Fettschritt erkennbar:@WebService public interface CreditRatingService { // sync operation Score getCreditScore(Customer customer); // async operation with polling Response<Score> getCreditScoreAsync(Customer customer); // async operation with callback Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
Der asynchrone Aufruf, der den Callback-Mechanismus verwendet, erfordert eine zusätzliche Eingabe vom Clientprogrammierer. Der Callback ist ein Objekt, das den Anwendungscode enthält, der ausgeführt wird, wenn eine asynchrone Antwort empfangen wird. Verwenden Sie das folgende Codebeispiel, um einen asynchronen Callback-Handler aufzurufen:CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // do work here... } } );
Verwenden Sie das folgende Codebeispiel, um einen asynchronen Abfrageclient aufzurufen:CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Während der Wartezeit eine Aktion ausführen. } // keine Umsetzung erforderlich, aufgrund generischer Elemente Score score = response.get();
- Ressourceninjektion verwenden
JAX-WS unterstützt Ressourceninjektion, um die Entwicklung von Web-Services noch weiter zu vereinfachen. JAX-WS verwendet diese Schlüsselfunktion von Java EE 5, um den Aufwand für die Erstellung und Initialisierung allgemeiner Ressourcen in einer Java-Laufzeitumgebung von Ihrer Web-Service-Anwendung auf die Umgebung des Anwendungscontainers selbst zu verlagern. JAX-WS unterstützt einen Teil der Annotationen, die in JSR-250 für Ressourceninjektion und Anwendungslebenszyklus definiert sind, in der Laufzeitumgebung.
Der Anwendungsserver unterstützt außerdem die Verwendung der Annotation "@Resource" oder "@WebServiceRef", um mit JAX-WS verwaltete Clients zu deklarieren und um die Injektion von JAX-WS-Services und -Ports anzufordern. Wird eine dieser Annotationen in einem Feld oder in einer Methode verwendet, bewirkt dies die Injektion einer JAX-WS-Service- oder -Portinstanz. Außerdem wird bei Verwendung dieser Annotationen der von der Annotation angegebene Typ in den JNDI-Namespace gebunden.
Die Annotation "@Resource" ist in der Spezifikation "JSR-250, Common Annotations" definiert, die in Java Platform, Enterprise Edition 5 (Java EE 5) enthalten ist. Wenn Sie die Annotation "@Resource" in einer Variablen des Typs javax.xml.ws.WebServiceContext in die Implementierungsklasse eines Serviceendpunks einfügen, können Sie eine Ressourceninjektion anfordern und die Schnittstelle javax.xml.ws.WebServiceContext, die sich auf diesen bestimmten Endpunktaufruf bezieht, erfassen. Über die Schnittstelle "WebServiceContext" können Sie den Nachrichtenkontext (MessageContext) für die Anforderung, die dem jeweiligen Methodenaufruf zugeordnet ist, mit der Methode getMessageContext() erfassen.
Die Annotation "@WebServiceRef" wird durch die Spezifikation JAX-WS definiert.
Das folgende Beispiel veranschaulicht die Verwendung der Annotationen "@Resource" und "@WebServiceRef" für die Ressourceninjektion:@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
Weitere Informationen zur Ressourceninjektion finden Sie in den Abschnitten 5.2.1 und 5.3 der Spezifikation JAX-WS.
- Datenbindung mit JAXB 2.2
JAX-WS nutzt die API Java Architecture for XML Binding (JAXB) 2.2 und Tools als Bindungstechnologie für die Zuordnungen zwischen Java-Objekten und XML-Dokumenten. Die JAX-WS-Tools stützen sich bei der Standarddatenbindung für bidirektionale Zuordnungen zwischen Java-Objekten und XML-Dokumenten auf JAXB-Tools. Die Datenbindung von JAXB ersetzt die in der Spezifikation JAX-RPC beschriebene Datenbindung.
JAX-WS 2.2 erfordert JAXB 2.2 für die Datenbindung. JAXB 2.2 bietet kleinere funktionale Erweiterungen für eine verbesserte Schemagenerierung und eine bessere Integration in JAX-WS.
- Dynamische und statische Clients
Die API für dynamische Clients von JAX-WS wird als Dispatch-Client (javax.xml.ws.Dispatch) bezeichnet. Der Dispatch-Client ist ein XML-Messaging-orientierter Client. Die Daten werden entweder im Modus PAYLOAD oder im Modus MESSAGE gesendet. Wenn Sie den Modus PAYLOAD verwenden, ist der Dispatch-Client nur für die Bereitstellung des Inhalts im Element <soap:Body> verantwortlich, und JAX-WS fügt die Elemente <soap:Envelope> und <soap:Header> hinzu. Wenn Sie den Modus MESSAGE verwenden, ist der Dispatch-Client für die Bereitstellung der gesamten SOAP-Rahmenanweisung (Envelope), einschließlich der Elemente <soap:Envelope>, <soap:Header> und <soap:Body> verantwortlich. JAX-WS fügt der Nachricht keine weiteren Elemente hinzu. Der Dispatch-Client unterstützt asynchrone Aufrufe über einen Callback- oder Abfragemechanismus.
Das Programmiermodell für statische Clients von JAX-WS wird als Proxy-Client bezeichnet. Der Proxy-Client ruft einen Web-Service auf der Basis einer Serviceendpunktschnittstelle auf, die bereitgestellt werden muss.
- Unterstützung für MTOM
Wenn Sie JAX-WS verwenden, können Sie binäre Anhänge, wie z. B. Bilder oder Dateien, zusammen mit Web-Service-Anforderungen senden. JAX-WS bietet Unterstützung für eine optimierte Übertragung binärer Daten gemäß MTOM-Spezifikation (Message Transmission Optimization Mechanism).
- Mehrere Datenbindungstechnologien
JAX-WS stellt dem Endbenutzer die folgenden Bindungstechnologien bereit: XML Source, SOAP Attachments API for Java (SAAJ) 1.3 und Java Architecture for XML Binding (JAXB) 2.2. XML Source ermöglicht einem Benutzer, ein javax.xml.transform.Source an die Laufzeitumgebung zu übergeben, das die Daten in einem zu verarbeitenden Source-Objekt darstellt. SAAJ 1.3 ermöglicht jetzt die Übergabe eines vollständigen SOAP-Dokuments über die Schnittstelle. Früher konnten nur die Nutzdaten selbst übergeben werden. Hierfür übergibt der Client das SAAJ-Objekt SOAPMessage über die Schnittstelle. JAX-WS nutzt die Unterstützung von JAXB 2.2 als Datenbindungstechnologie zwischen Java und XML.
- Unterstützung für SOAP 1.2
JAX-WS 2.0 wurde die Unterstützung für SOAP 1.2 hinzugefügt. JAX-WS unterstützt SOAP 1.1 und SOAP 1.2, sodass Sie binäre Anhänge, wie z. B. Bilder oder Dateien, zusammen mit Web-Service-Anforderungen senden können. JAX-WS bietet Unterstützung für eine optimierte Übertragung binärer Daten gemäß MTOM-Spezifikation (Message Transmission Optimization Mechanism).
- Entwicklungstools
JAX-WS stellt die Befehlszeilentools wsgen und wsimport für die Generierung portierbarer Artefakte für JAX-WS-Web-Services bereit. Wenn Sie JAX-WS-Web-Services erstellen, können Sie eine WSDL-Datei oder eine Implementierungs-Bean-Klasse als Ausgangspunkt verwenden. Wenn Sie mit einer Implementierungs-Bean-Klasse beginnen, verwenden Sie das Befehlszeilentool wsgen, um alle Web-Service-Serverartefakte, einschließlich einer WSDL-Datei (sofern angefordert), zu generieren. Wenn Sie mit einer WSDL-Datei beginnen, verwenden Sie das Befehlszeilentool wsimport, um alle Web-Service-Artefakte für den Server oder den Client zu generieren. Das Befehlszeilentool wsimport verarbeitet die WSDL-Datei mit Schemadefinitionen, um die portierbaren Artefakte zu generieren, zu denen die Serviceklasse, die Serviceendpunktschnittstellenklasse und die JAXB-Klassen der Version 2.2 für das entsprechende XML-Schema gehören.
- Unterstützung für Web Services for Java EE Version 1.3
Die Spezifikation Web Services for Java EE Version 1.3 bietet jetzt auch Unterstützung für die Konfiguration der Features MTOM, Addressing und RespectBinding in JAX-WS-Services und -Clients über die Nutzung von Annotationen und Implementierungsdeskriptoreinträgen.
- Unterstützung für leeren Parameter targetNamespace für Parameterstil WRAPPED und RückgabetypenJAX-WS 2.2 unterstützt Methodenparameter und Rückgabetypen. In einer JAX-WS-Web-Service-Operation können Sie eine Web-Service-Operation mit einem Operationsparameter und einem optionalen Rückgabetyp definieren. Wenn der Operationsparameter und der Rückgabetyp eine leere targetNamespace-Eigenschaft definieren, weil für die Eigenschaft targetNamespace der Wert "" mit der Annotation "@WebParam" oder "@WebResult" angegeben wurde, zeigt die JAX-WS-Laufzeitumgebung das folgende Verhalten:
- Wenn die Operation den Stil DOCUMENT hat, ist der Parameterstil WRAPPED und der Parameter wird keinem Header zugeordnet. In diesem Fall wird den Optionsparametern und Rückgabetypen ein leerer Parameter vom Typ "Namespace" zugeordnet.
- Wenn der Parameterstil nicht WRAPPED ist, wird der mit der Annotation "@WebParam" oder "@WebResult" angegebene Wert des Parameters "targetNamespace" verwendet.