Axis2 versus XFire – Das Duell
Kommentare

Auch wenn sich die services.xml in der Syntax unterscheiden, so kann man festhalten, dass beide Projekte an dieser Stelle nahezu die gleichen Konfigurationsmöglichkeiten bieten: Definition von Services,

Auch wenn sich die services.xml in der Syntax unterscheiden, so kann man festhalten, dass beide Projekte an dieser Stelle nahezu die gleichen Konfigurationsmöglichkeiten bieten: Definition von Services, Festlegen von Methoden, Message Styles, Message Receivern/Invokern, Handlern usw. Für den XFire Web Service benö­tigt man unter Umständen noch eine web.xml, die eingehende Anfragen an das XFire­Servlet delegiert (Listing 6). Um die Archive zum Deployment des Web Services zu erzeugen, soll ein Ant-Skript zum Einsatz kommen. Listing 7 zeigt, wie so ein Skript aussehen könnte. In Abbildung 3 ist noch mal das komplette Eclipse-Projekt dargestellt.

Listing 6: web.xml für XFire
------------------------------------------------------------------

    
XFireServletXFire Servlet
        org.codehaus.xfire.transport.http.XFireConfigurableServlet
    XFireServlet/servlet/XFireServlet/*XFireServlet/services/*
Listing 7: Ant-Skript zum Bauen der Axis2- und XFire Web Services
-----------------------------------------------------------------------------

Nach dem Ausführen des Tasks sollte auf C: eine Datei mit dem Namen BookService.aar existieren, diese kann nun nach Axis2 hochgeladen werden. Unter folgendem URL ist die WSDL­ der Axis2-Version des Web Services jetzt verfügbar: http://localhost:8080/axis2/services/Book-Service?wsdl. Wird bei Axis2 ?wsdl durch ?xsd ersetzt, dann erhält man zusätzlich noch ein XML-Schema für den Service. Das Ausführen des Tasks führt zur Datei BookService.war, die dann in einen Servlet-Container eingespielt werden kann. Die WSDL des XFire Web Services ist dann hier verfügbar: http://localhost:8080/BookService/services/BookService?wsdl.

Abb. 3: Das Web-Service-Projekt in Eclipse

Zum Abschluss fehlt noch der Client. Aus Platzgründen kann leider nur ein Client besprochen werden. Dieser soll mit Axis2 implementiert werden, da man hier aufgrund von AXIOM etwas aufwendiger (im Gegensatz zu einem XFire-Client) entwickeln muss. Der Client (Listing 8) ruft beide Methoden des Service auf und gibt die entsprechenden Bücher samt Autoren aus.

Listing 8: Ein Web-Service-Client, wie er mit Axis2 programmierbar ist
-------------------------------------------------------------------------------
package de.javamagazin;

import java.util.ArrayList;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class Axis2Client {

     private static EndpointReference endpoint = new EndpointReference(
               "http://localhost:8080/axis2/services/BookService");

     private static QName findBookOperation = new QName(
               "http://javamagazin.de/xsd", "findBook");

     private static QName getBooksOperation = new QName(
               "http://javamagazin.de/xsd", "getBooks");

     public static void main(String[] args) {
          try {
               Options options = new Options();
               options.setTo(endpoint);
               RPCServiceClient sender = new RPCServiceClient();
               sender.setOptions(options);

               ArrayList arguments = new ArrayList();
               arguments.add("978-3-935042-81-9");

               OMElement response = sender.invokeBlocking(findBookOperation,
                         arguments.toArray());
               Book book = (Book) BeanUtil.deserialize(Book.class, response
                         .getFirstElement());
               printBook(book);

               ArrayList resobj = new ArrayList();
               resobj.add(Book.class);
               resobj.add(Book.class);

               Object[] returned = sender.invokeBlocking(getBooksOperation,
                         new ArrayList().toArray(), resobj.toArray());

               for (Object o : returned) {
                    book = (Book) o;
                    printBook(book);
               }

          } catch (AxisFault axisFault) {
               axisFault.printStackTrace();
          }
     }

     private static void printBook(Book book) {
          System.out.println("Title: " + book.getTitle());
          for (int i = 0; i 

Interessant ist hier das Zusammenspiel mit AXIOM: Nachdem über einen RPCServiceClient die Methode aufgerufen wurde, bekommt man ein OM-Element zurück. Hierbei handelt es sich um das bereits angesprochene Wrapper-Objekt von AXIOM. Über eine Hilfsmethode der Klasse BeanUtil, ebenfalls Bestandteil von Axis2, lässt sich der Wrapper jedoch wieder sehr leicht in das erwartete Book-Objekt serialisieren.

Marc Teufel arbeitet als Entwickler bei der hama GmbH & Co KG. Er ist Autor zahlreicher Fachartikel in den Bereichen .NET und Java, hat bereits ein Buch über Apache Axis veröffentlicht  und schreibt derzeit mit zwei anderen Autoren an einem Buch zu Apache Axis2. Kontakt: marc.teufel[at]hama.de.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -