Happy JAX-WS-ing!

Los geht’s mit einem SEI

Wie bei allen Remote-Kommunikationen empfiehlt es sich auch bei JAX-WS, die Entwicklung mit der Definition eines Remote-Interfaces zu starten. Dieses wird im JAX-WS-Jargon als Service-Endpoint-Interface oder auch SEI bezeichnet. Ein SEI ist ein normales Java-Interface mit zusätzlichen Annotationen (Listing 1).

Listing 1: Service-Endpoint-Interface (SEI) in JAX-WS
@WebService(name = "Booking", targetNamespace = "http://booking.axis2lab.com")
public interface BookingService {
    @WebMethod(operationName = "makeReservation")
    @WebResult(name = "reservationNumber")
    public String reserve(Hotel hotel, @WebParam(name = "bookingDate") Date date);
}

Die @WebService-Annotation besagt, dass es sich bei dem Interface um ein Service-Endpoint-Interface handelt. Alle in diesem Interface über Annotationen festgelegten Metadaten entsprechen den Daten, die sich im abstrakten Teil der WSDL-Beschreibung finden. Hierzu gehören Typen, Operationen und Porttypes. Um auf die Benennung der Elemente in der WSDL-Beschreibung Einfluss nehmen zu können, sieht JAX-WS zusätzliche, optionale Annotationen wie @WebMethod, @WebParam und @WebReturn vor, die bei Bedarf zum Einsatz kommen können. Für den Fall, dass diese Annotationen fehlen, werden die Namen über Konventionen ermittelt und sind dann meistens identisch mit den Namen der korrespondierenden Java-Elemente.

Implementierung des Services

Nach der Schnittstellendefinition wird im nächsten Schritt die Service-Implementierung erstellt. Das kann komplett in Java erfolgen. Über Annotationen lassen sich weitere Metadaten im Service festlegen, insbesondere die Konfiguration von Informationen für den konkreten Teil der WSDL-Beschreibung (Benennung von Ports und Services). Mit Listing2 ist der Service dann auch schon fertig implementiert und kann in Betrieb genommen werden.

Listing 2: Service-Implementierung
@WebService(
        targetNamespace = "http://booking.axis2lab.com",
        serviceName = "BookingService",
        endpointInterface = "com.axis2lab.booking.BookingService",
        portName = "BookigPort")
public class BookingServiceImpl implements BookingService {

    public String reserve(Hotel hotel, Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        System.out.println("Booking hotel " + hotel.getName() + " on "
                           + sdf.format(date));
        return UUID.randomUUID().toString();
    }
}
Deployment in Axis2

Das Deployment lässt sich am einfachsten dadurch bewerkstelligen, die betroffenen Class-Dateien in ein JAR-Archiv zu packen und dieses dann in das Verzeichnis servicejars in einem Axis2-Repository abzulegen. Im Falle eines Axis2-Deployments als Webapplikation befindet sich dieses Verzeichnis unter webapps/axis2/WEB-INF/servicejars. Dank der flexiblen Custom-Deployer-Architektur in Axis2 lässt sich dieses Verzeichnis auch beliebig umkonfigurieren. Wichtig ist nur, dass bei der Konfiguration in der zentralen Axis-Konfigurationsdatei axis2.xml der JAXWSDeployer eingesetzt wird (Listing 3). Dieser Deployer durchsucht alle Klassen der in dem festgelegten Verzeichnis befindlichen Archive nach entsprechenden JAX-WS-Annotationen (konkret handelt es sich um @WebService und @WebServiceProvider) und erzeugt aus den Annotationen die internen Modelle (AxisServiceGroup, AxisService, AxisOperation usw.) für Axis2.

Hierbei sollte angemerkt werden, dass man einen in JAX-WS implementierten Service in Axis2 ebenfalls mit Hilfe des klassischen Deployment-Verfahrens (Bereitstellen von services.xml und Verpacken in aar-Archiv) in Betrieb nehmen kann. In diesem Fall stehen selbstverständlich sämtliche Optionen für das Deployment zur Verfügung, die über services.xml konfiguriert werden können.

Listing 3: JAXWS-Deployer Konfiguration

Nach erfolgreichem Deployment erscheint der Service sofort in der Serviceliste von Axis2 und kann Serviceaufrufe entgegennehmen.

Kommentare

Schreibe einen Kommentar

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