Happy JAX-WS-ing!

JAX-WS Service-Client

Um nun einen Service-Client zu erstellen, ist es notwendig, zuvor an die WSDL-Beschreibung dieses Services zu gelangen. Axis2 liefert out of the box kein Werkzeug wie Java2WSDL, um aus einem JAX-WS-Service eine WSDL-Beschreibung zu generieren. Hier greift man auf das Standard-Werkzeug wsgen zurück. Enthalten ist dieses Werkzeug in der JAX-WS-Referenz-Implementierung und ist somit auch Bestandteil von Java SE 6. Das Zurückgreifen auf externe Tools sollte jedoch nicht der falsche Eindruck entstehen lassen, dass Axis2 Funktionalität der Referenzimplementierung „klauen“ würde. Bei wsgen sowie wsimport handelt es sich schlicht um zwei allgemeingültige Werkzeuge, welche die Konvertierung zwischen Java und WSDL (und XML-Schema) übernehmen. Es wird aus einer JAX-WS-konformen Serviceklasse mit diesem Werkzeug immer dieselbe WSDL-Beschreibung generiert. Dies gilt auch für die umgekehrte Richtung, also die Generierung von Java-Artefakten aus WSDL mittels wsimport. Axis2 verlässt sich hier also voll und ganz auf die Standardwerkzeuge. Was sich bei Axis2 von der Referenzimplementierung allerdings deutlich unterscheidet, ist die interne Implementierung des JAX-WS-Service-Provider-Interface, wie im nächsten Abschnitt noch näher erläutert wird.

Axis2 unterstützt auch bei JAX-WS-Services die dynamische Generierung der WSDL-Beschreibung mit der ?wsdl-Syntax. Dies funktioniert ad-hoc jedoch nur in einer Java 6-Umgebung, wo JAX-WS Bestandteil des JDK ist. Bei einem Betrieb unter Java 5 ist es notwendig, zusätzlich jaxws-rt.jar und jaxws-tools.jar aus der Referenzimplementierung in die Webapplikation zu kopieren.

Nachdem die WSDL-Beschreibung für den obigen Service vorliegt, kann die clientseitige Entwicklung gestartet werden. Aus der WSDL-Beschreibung können viele Artefakte wie Stub, Service-Endpoint-Interface und weitere Datentypenklassen generiert werden. Auch hier verwendet man ganz bewusst das Werkzeug wsimport von JAX-WS-RI, weil die generierten Klassen nicht Axis2-spezifisch sind, sondern nur JAX-WS-Annotationen enthalten, die nicht implementierungsneutral sind. In Listing 4 sieht man den Aufruf von wsimport im Rahmen eines Ant-Tasks.

Listing 4: Stub-Generierung mit wsimport

Mithilfe der so generierten Klassen lässt sich die Entwicklung eines Web-Service-Clients nun sehr einfach gestalten. Über die Methode getBookingPort() in der BookingService-Klasse erhält man einen Proxy auf den Web Service, der typkompatibel zu dem Service-Endpoint-Interface (Booking.java) ist. Eine SOAP-Nachricht zum Web Service kann verschickt werden, indem die entsprechende Methode über den Proxy aufgerufen wird.

Listing 5: JAX-WS Client für BookingService
public class BookingClient {
    public static void main(String[] args) throws DatatypeConfigurationException {
        Booking booking = new BookingService().getBookigPort();
        Hotel hotel = new Hotel();
        hotel.setLocation("Berlin");
        hotel.setName("Adlon");
        XMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendar();
        String reservation = booking.makeReservation(hotel, date);
        System.out.println("Reservation number: " + reservation);
    }
}
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.