Web Services leicht gemacht mit XFire
Kommentare

XFire-Client
Der Client kann mit jedem beliebigen SOAP-Werkzeug erstellt werden. Eine komfortable Art und Weise, einen Client zu entwickeln, ist die Verwendung der XFire-Proxy-Klassen, bei denen ein

XFire-Client

Der Client kann mit jedem beliebigen SOAP-Werkzeug erstellt werden. Eine komfortable Art und Weise, einen Client zu entwickeln, ist die Verwendung der XFire-Proxy-Klassen, bei denen ein dynamischer Proxy erzeugt wird. Listing 4 demonstriert die Erstellung eines XFire-Clients. Mithilfe der ObjectServiceFactory wird ein Servicemodell basierend auf der Interface-Definition erstellt, welches die Service-Metadaten enthält. Mithilfe des Service-URL und des Servicemodells kann nun ein dynamischer Proxy über die XFireProxyFactory erstellt werden. Anschließend können wie gehabt die Methoden vom Interface verwendet werden.

Listing 4: XFire Proxy
-----------------------------------------------------------------------------
Service serviceModel = new ObjectServiceFactory().create(ICustomerService.class);
String serviceUrl = "http://localhost:8080/springRemote/services/Customer";

try {
  //Proxy erstellen
  ICustomerService service = (ICustomerService) 
                                new  XFireProxyFactory().create(serviceModel,
                                                                serviceUrl);
  //Methoden können aufgerufen werden
  System.out.println(service.getState("55"));

} catch (MalformedURLException e) {
  System.out.println("Call Customer Web Service : EXCEPTION: " + e.toString());
}
XFire in Spring verwenden

Ein tolles Feature von XFire ist auf jeden Fall die Unterstützung unterschiedlicher Container, unter anderem auch Spring. So können die Servicekomponenten vom Container verwaltet und gleichzeitig auch Features des Containers in Anspruch genommen werden. Betrachtet man die Integration zwischen XFire und Spring, so greift XFire auf die schon bekannte Remote-Architektur von Spring zurück und stellt einen passenden XFireExporter zur Verfügung. Neben dem Exporter können Web Services auch mittels Web Service Annotations exportiert werden. Wir betrachten zuerst die Verwendung des Exporters und anschließend nehmen wir die Vorgehensweise mit den Annotations genauer unter die Lupe.

Wie bei Burlap, Hessian oder dem http Invoker von Spring werden auch für XFire die Dienste mithilfe des XFireExporter exportiert. Dieser Exporter implementiert das bekannte RemoteExporter-Interface von Spring. Um den Exporter verwenden zu können, muss zuerst das XFireSpringServlet in der web.xml deklariert werden. Wie anfangs bereits erwähnt, ist XFire eine Servlet-basierte Anwendung.

xfire
       org.codehaus.xfire.spring.XFireSpringServlet
   

Wie für ein DispatcherServlet in Spring existiert auch für das XFireSpringServlet eine passende Konfigurationsdatei mit dem Namen xfire-servlet.xml. In dieser Konfigurationsdatei befinden sich nun die zu exportierenden Web Services. Wie Listing 5 zeigt, werden XFire-spezifische Beans, wie zum Beispiel Service Factories, verwendet. Daher muss noch die xfire.xml-Konfigurationsdatei zu Beginn importiert werden. Alternativ kann diese auch in der web.xml geladen werden.

Listing 5
---------------------------------------------------------------------
at.demolsky.ICustomerService

Die id definiert, unter welchem Namen das Service lokalisiert werden kann. Hier wird auch ersichtlich, dass von XFire definierte Beans verwendet werden, wie zum Beispiel die xfire.serviceFactory und xfire. Die referenziert auf die Implementierung des Service. Die legt die Interface-Definition fest. Das war es auch schon.

Leicht gemacht mit Annotations

Mit Java 5 können Beans mit Annotations nach dem JSR 181 versehen werden. Bei dieser Variante werden die Beans mit Web Service Annotations versehen. Es hängt vom Entwickler ab, ob die Annotations in der Implementierung oder im Interface hinterlegt werden. Die Implementierung gegen Interfaces entspricht jedoch einem besseren Programmierstil, daher betrachten wir im Folgenden auch die Interface-Variante: In der passenden Implementierung (ICustomerServiceImpl) des Interfaces befindet sich zu Beginn folgende Annotation:

@WebService(serviceName="customerService", 
            endpointInterface="ICustomerService"). 

Diese Annotation benachrichtigt den JSR 181-Prozessor, dass dieser Service unter dem Namen “customerService“ erreichbar ist und dass das Interface ICustomerService als Endpoint-Interface dient, welches die weiteren Metadaten des Service zur Verfügung stellt. Listing 6 zeigt die notwendigen Annotations im Interface.

Listing 6
----------------------------------------------------------------------
Web-Service-Annotationenpackage at.demolsky.customer.service;

@WebService
public interface ICustomerService {
  @WebMethod
  @WebResult(name = "allCustomersResult")
  public List loadAllCustomers();
  //Other service methods
}

Sollen alle Methoden eines Interfaces als Web Service exportiert werden, so muss die Annotation @WebMethod nicht für jede Methode angegeben werden. Wir wollen in diesem Beispiel nur die Methode loadAllCustomers als Service zur Verfügung stellen. Auch die Annotation @WebResult ist eine optionale Angabe und definiert lediglich den Methodennamen in der WSDL.

Nachdem die Services mit Annotations versehen wurden, gibt es nun mehrere Möglichkeiten, XFire für die Web Annotations zu konfigurieren:

1. Wird das XFireConfigurableServlet verwendet (ohne Container), so muss in der service.xml nur die mit dem Wert jsr181 gesetzt werden:

at.demolsky.customer.ICustomerServicejsr181

2. Wird das XFireSpringServlet verwendet, kann dies mit einem Handler Mapper gelöst werden.

Im Folgenden wird nun die Variante mit dem XFireSpringServlet und einem passenden Handler Mapper etwas näher beleuchtet. Das Servlet wurde bereits in der web.xml definiert und wird weiterhin durch die Konfigurationsdatei xfire-servlet.xml konfiguriert.

Listing 7: Web Service Annotations
---------------------------------------------------------------------
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -