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 erstellenICustomerService service = (ICustomerService)new XFireProxyFactory().create(serviceModel,serviceUrl);//Methoden können aufgerufen werdenSystem.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.
<servlet><servlet-name>xfire</servlet-name><servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class></servlet>
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---------------------------------------------------------------------<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/><bean id="customerWS"class="org.codehaus.xfire.spring.remoting.XFireExporter"><property name="serviceFactory" ref="xfire.serviceFactory"/><property name="xfire" ref="xfire"/><property name="serviceBean" ref="customerService"/><property name="serviceClass"><value>at.demolsky.ICustomerService</value></property></bean>
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 <serviceBean> referenziert auf die Implementierung des Service. Die <serviceClass> 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;@WebServicepublic 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 <serviceFactory> mit dem Wert jsr181 gesetzt werden:
<service><serviceClass>at.demolsky.customer.ICustomerService</serviceClass><serviceFactory>jsr181</serviceFactory></service>
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---------------------------------------------------------------------<!--<bean id="webAnnotations"class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"/><bean id="handlerMapping"class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping"><property name="typeMappingRegistry"><ref bean="xfire.typeMappingRegistry"/></property><property name="xfire"><ref bean="xfire"/></property><property name="webAnnotations"><ref bean="webAnnotations"/></property></bean><bean id="customerService"class="at.demolsky.ICustomerServiceImpl"/><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="urlMap"><map><entry key="/"><ref bean="handlerMapping"/></entry></map></property></bean>
Bei der Verwendung der Konfiguration in Listing 7 werden alle Beans mit den entsprechenden Annotations automatisch exportiert. Daher ist es auch wichtig, dass die Services mit Annotations erst nach dem handlerMapping Bean definiert werden. Es muss nicht sein, dass Fehler auftreten, aber es ist zu empfehlen, dass die Services erst nachher definiert werden. Das Service wird entsprechend den Metadaten in den Klassen exportiert, d.h., der Kundenservice ist unter dem Namen customerService erreichbar.
Performance und andere Features
Beim Schlagwort Performance haben Web Services einen Nachteil, da sie viele Ressourcen in Anspruch nehmen. Doch XFire punktet hier durch die Verwendung der Streaming API for XML (StAX) [Alesandro Costa Peireira, Falk Hartmann: Der Mittelweg. Lesen und Schreiben von XML-Dokumenten mit dem Streaming API for XML, in Java Magazin 7.2006] und erzielt eine weitaus bessere Performance als vergleichsweise andere Produkte in diesem Bereich. Auf der Website von XFire befinden sich interessante Erfahrungs- und Vergleichsberichte bezüglich der Performance.Durch das junge Alter von XFire ist dieses Framework im Vergleich zu anderen noch etwas eingeschränkt im Hinblick auf Funktionalität und Features. Die wichtigsten Features finden Sie im nebenstehenden Kasten zusammengefasst.
- Native Data Binding Support für POJOs, XMLBeans, JAXB und Castor
- Streaming API for XML (StAX) für die Verarbeitung von XML-Dokumenten
- Verschiedene Transportprotokolle wie http oder JMS
- Unterstützung für Web-Service-Standards (SOAP, WSDL, WS-Addressing, WS-Security, etc.)
- JBI-Support
- Container-Unterstützung (Spring, PicoContainer ...)
- Eclipse-Plug-in




