Die Java™ API for XML-based Web Services (JAX-WS), auch bekannt als JSR 224, ist ein Programmiermodell für Web-Services der nächsten Generation, das die vom Programmiermodell Java API for XML-based RPC (JAX-RPC) gelegten Grundlagen erweitert. Die Verwendung von JAX-WS vereinfacht die Entwicklung von Web-Services und -Clients und bietet durch den Einsatz von dynamischen Proxys und Java-Annotationen eine größere Plattformunabhängigkeit. Die in diesem Produkt enthaltenen Web-Service-Tools unterstützen JAX-WS 2.0, 2.1 und 2.2.
JAX-WS ist ein neues Programmiermodell, das die Anwendungsentwicklung vereinfacht. Unterstützt wird ein annotationsbasiertes Modell für die Entwicklung von Web-Service-Anwendungen und -Clients. Strategisch gesehen folgt der JAX-WS-Programmierstandard dem aktuellen Branchentrend hin zu einem mehr dokumentzentrierten Messaging-Modell und ersetzt das von JAX-RPC definierte Programmiermodell mit fernen Prozeduraufrufen. Dieses Produkt bietet noch Unterstützung für das Programmiermodell JAX-RPC, obwohl es in JAX-RPC Einschränkungen gibt. Viele aktuelle dokumentzentrierte Services werden von JAX-RPC nicht unterstützt. JAX-WS ist das strategische Programmiermodell für die Entwicklung von Web-Services und ein erforderlicher Teil der Plattform Java EE 5.
Mit JAX-WS wird die Unterstützung für die Annotation von Java-Klassen eingeführt, durch die angezeigt wird, dass die Java-Klasse ein Web-Service ist. JAX-WS unterstützt die Verwendung von Annotationen gemäß den Spezifikationen JSR 175 (A Metadata Facility for the Java Programming Language) und JSR 181 (Web Services Metadata for the Java Platform) sowie von Annotationen, die in JAX-WS 2.0 definiert sind. Durch die Verwendung von Annotationen im Java-Quellcode und in der Java-Klasse wird die Entwicklung von Web-Services einfacher. Mit den Annotationen werden einige der Zusatzinformationen definiert, die normalerweise aus Implementierungsdeskriptordateien, WSDL-Dateien oder Zuordnungsmetadaten von XML- und WSDL-Dateien für die Quellenartefakte abgerufen werden.
Sie können in den Java-Quellcode beispielsweise ein einfaches Tag @WebService aufnehmen, um die Bean als Web-Service zugänglich zu machen.
@WebService
public class QuoteBean implements StockQuote {
public float getQuote(String sym) { ... }
}
Die Annotation @WebService teilt der Serverlaufzeitumgebung mit, dass alle öffentlichen Methoden dieser Bean als ein Web-Service zugänglich gemacht werden sollen. Durch das Hinzufügen weiterer Annotationen für einzelne Methoden und Parameter ist eine zusätzliche Differenzierung und Unterteilung möglich. Mit Annotationen können Java-Artefakte viel einfacher als Web-Services zugänglich gemacht werden. Wenn Artefakte mit einigen der Top-down-Zuordnungstools mit einer WSDL-Datei als Ausgangspunkt erstellt werden, können Annotationen außerdem in den Quellcode und in Java-Klassen aufgenommen werden, um neben den Quellendateien auch die Metadaten zu erfassen.
Mit JAX-WS können Web-Services sowohl synchron als auch asynchron aufgerufen werden. JAX-WS bietet beim asynchronen Aufrufen von Web-Services Unterstützung für einen Abfragemechanismus und für einen Callback-Mechanismus. Bei Verwendung eines Abfragemodells kann ein Client eine Abfrage absetzen und daraufhin ein Antwortobjekt erhalten, das abgefragt wird, um festzustellen, ob der Server geantwortet hat. Wenn der Server antwortet, wird die eigentliche Antwort abgerufen. Wenn das Abfragemodell verwendet wird, kann der Client mit anderen Arbeitsschritten fortfahren und muss dafür nicht auf den Erhalt der Antwort warten. Bei der Verwendung des Callback-Modells stellt der Client einen Callback-Handler bereit, der das eingehende Antwortobjekt akzeptiert und verarbeitet. Beim Abfrage- und beim Callback-Modell kann sich der Client auf die Fortsetzung seiner Arbeit konzentrieren, während er gleichzeitig ein dynamischeres und effizienteres Modell für das Aufrufen von Web-Services bereitstellt.
Eine Web-Service-Schnittstelle hat beispielsweise Methoden für synchrone und asynchrone Anfragen.
@WebService
public interface CreditRatingService {
// synchrone Operation
Score getCreditScore(Customer customer);
// asynchrone Operation mit Abfrage
Response<Score> getCreditScoreAsync(Customer customer);
// asynchrone Operation mit Callback
Future<?> getCreditScoreAsync(Customer customer,
AsyncHandler<Score> handler);
}
Der asynchrone Aufruf, bei dem der Callback-Mechanismus verwendet wird, erfordert eine zusätzliche Eingabe vom Clientprogrammierer. Der Callback-Handler ist ein Objekt, das den Anwendungscode enthält, der beim Empfang einer asynchronen Antwort ausgeführt wird. Das folgende Codebeispiel zeigt einen asynchronen Callback-Handler:
CreditRatingService svc = ...;
Future<?> invocation = svc.getCreditScoreAsync(customerFred,
new AsyncHandler<Score>() {
public void handleResponse (
Response<Score> response)
{
Score score = response.get();
// hier Arbeiten ausführen...
}
}
);
Das folgende Codebeispiel zeigt einen asynchronen Abfrageclient:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerFred);
while (!response.isDone()) {
// Aktivität während der Wartezeit ausführen
}
// dank generischer Werte keine Umsetzung nötig
Score score = response.get();
</Score>
JAX-WS unterstützt die 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. Die Laufzeitumgebung von JAX-WS unterstützt einen Teil der Annotationen, die in JSR 250 für Ressourceninjektion und Anwendungslebenszyklus definiert sind.
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 JSR 250 (Spezifikation "Common Annotations") definiert, die Teil von Java Platform, Enterprise Edition 5 (Java EE 5) ist. Wenn Sie die Annotation @Resource in einer Variablen des Typs javax.xml.ws.WebServiceContext in die Implementierungsklasse eines Serviceendpunkts 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.
@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 JAX-WS-Spezifikation.
WebSphere Application Server Version 7.0 unterstützt die Spezifikation JAXB 2.1. JAX-WS 2.1 erfordert JAXB 2.1 für die Datenbindung. JAXB 2.1 stellt Erweiterungen bereit, z. B. eine verbesserte Kompilierungsunterstützung und Unterstützung für Annotationen vom Typ @XMLSeeAlso sowie volle Unterstützung für Schema 1.0.
WebSphere Application Server Version ab Version 8.0 und WebSphere Application Server Liberty Profile Version 8.5.5 bieten Unterstützung für die Spezifikation JAXB 2.2. 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 von JAX-WS.
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 generierten oder bereitgestellten Serviceendpunktschnittstelle (SEI, Service Endpoint Interface) auf.
public class Base
{
@WebMethod(exclude=false)
public void superExposed(String s) {}
public String supernoanno(String s) {}
}
@WebService
public class BeanImpl extends Base
{
@WebMethod(exclude=false)
public void exposed(String s) {}
public String nonpublic(String s) {}
}
Bis JAX-WS 2.1.6 wurde nur die Methode public
void exposed(String s) zugänglich gemacht. Ab JAX-WS 2.1.6 und in aktuelleren Versionen werden die folgenden Methoden zugänglich gemacht: public void exposed(String s)
public String nonpublic(String s)
public void superExposed(String s)
WebSphere Application Server Version enthält diese Änderungen ab Version 7.0.0.7 in Form des IBM® JDK 6 SR6. Wenn Sie möchten, dass die Workbench Anweisungen für die Verwendung von JAX-WS 2.1.6 bereitstellt, wählen Sie wahr.
aus und setzen Sie die Einstellung "Anleitungen für Methoden-Exposure von JAX-WS 2.1.6 und höher bereitstellen" aufDie Spezifikation JAX-WS 2.2 beinhaltet die Funktionen der Spezifikation JAX-WS 2.1 sowie darüber hinausgehende Funktionen. In JAX-WS 2.2 ist clientseitige Unterstützung für die Verwendung WebServiceFeature-bezogener Annotationen wie @MTOM, @Addressing und @RespectBinding hinzugekommen. In JAX-WS 2.1 war zuvor die Unterstützung für diese Annotationen auf dem Server hinzugefügt worden. Mit der Spezifikation "Web Services for Java EE 1.3" wird darüber hinaus Unterstützung für diese WebServiceFeature-bezogenen Annotationen sowie für die Verwendung von Implementierungsdeskriptorelementen zum Konfigurieren dieser Features auf dem Client und dem Server eingeführt. JAX-WS 2.2 erfordert Java Architecture for XML Binding (JAXB) Version 2.2 für die Datenbindung.
Weitere Informationen zu JAX-WS finden Sie in der offiziellen Spezifikation JSR 224 unter JSR 224: Java API for XML-Based Web Services (JAX-WS) 2.0.