Gruppe: 1 3. Hausübung Web Services mit Java Abgabedatum: Freitag, 24. Mai 2013 LVA: Institut für Wirtschaftsinformatik – Software Engineering Service Engineering KV LVA Nummer: 259028 (2013S) Matthias Rosenthaler 0855558 [email protected] Johann Tuder 1255771 [email protected] Manuel Mitasch 0957201 [email protected] Elisabeth Rumetshofer 0957466 [email protected] Michal Wasilewski 0556658 [email protected] Inhaltsverzeichnis 1 Überblick APIs..................................................................................................................................1 2 JAX-RPC: Java-API for XML-based RPC.......................................................................................4 2.1 Kompatibilität............................................................................................................................4 2.2 Erstellung eines Web-Service....................................................................................................4 2.3 Erstellung eines Client...............................................................................................................5 3 JAX-WS: Java-API for XML Web Services.....................................................................................6 3.1 Implementation First vs. Contract First ....................................................................................7 3.2 Annotationen .............................................................................................................................7 3.3 Deployment ...............................................................................................................................8 3.3.1 Standalone..........................................................................................................................8 3.3.2 Servlet Container................................................................................................................8 3.3.3 Abhängigkeiten..................................................................................................................9 3.4 Clients .......................................................................................................................................9 4 Beispiel mit JAX-WS: Kontaktmanager.........................................................................................10 4.1 Idee...........................................................................................................................................10 4.2 Implementierung Serverseite...................................................................................................11 4.2.1 Web-Service.....................................................................................................................11 4.2.2 Server...............................................................................................................................11 4.3 Implementierung Clientseite....................................................................................................12 5 Lessons Learned..............................................................................................................................13 Abbildungsverzeichnis.......................................................................................................................14 Quellen...............................................................................................................................................14 1 Überblick APIs Das sogenannte Java XML Pack beinhaltet APIs und Referenz-Implementierungen, die die XMLVerarbeitung durch die Abstraktion der Komplexität erheblich vereinfachen. Der Einsatz dieser APIs steigert die Produktivität der Entwickler und erhöht die Code-Qualität durch einfache und modulare Schnittstellen. Im Bereich der Web Service Entwicklung mit Java werden die in Abbildung 1 als rosa Blöcke dargestellten APIs eingesetzt. [1] Abbildung 1: Überblick APIs Diese APIs können in folgende Kategorien untergliedert werden: Dokument-orientierte APIs: Hierbei handelt es sich um APIs, die dazu dienen Informationen aus XML-Dokumenten zu verarbeiten. • Java API for XML Processing (JAXP) • Java Architecture for XML Binding (JAXB) JAXP wird der Vollständigkeit halber angegeben und hier nicht näher erläutert. Prozedur-orientierte APIs Prozedur-orientierte APIs ermöglichen den Nachrichtenaustausch in Form von XML-Dokumenten mit Hilde von Netzwerkdiensten, wie zum Beispiel das Senden von SOAP-Nachrichten in B2BVerbindungen). Seite 1 von 14 • Java API for XML Processing (JAXP) • Java API for XML Messaging (JAXM) • Java API for XML Registries (JAXR) • Java API for XML-based RPC (JAX-RPC) • SOAP with Attachments API for Java (SAAJ) In der folge werden die einzelnen APIs (mit Ausnahme von JAX-RPC und JAX-WS) genauer besprochen: Java API for XML Messaging (JAXM) JAXM ist eine API für den Nachrichtenaustausch zwischen Applikationen (A2A), B2BAnwendungen und Web Services. Obwohl die Spezifikation von JAXM das Nachrichtenprotokoll nicht näher definiert, wird überwiegend SOAP eingesetzt. Als Verbindungsprotokolle kommen vor allem HTTP, SMPT und FTP zum Einsatz, wobei auch diese in der JAXM- Spezifikation nicht vordefiniert sind. JAXM ermöglicht sowohl direkte Kommunikation, als auch den Austausch von Nachrichten über sogenannte Message- Provider. Des Weiteren ist mit JAXM ein synchroner oder asynchroner Nachrichtenaustausch möglich. Die Nachrichtenübertragung ist sicher. Jedoch verliert diese API immer mehr an Bedeutung. Java API for XML Registries (JAXR) Registries dienen dazu, um Informationen über Dienste zu veröffentlichen. JAXR-Provider werden als Wrapper zu Registry- Providern; ähnlich Wrapper-Klassen, eingesetzt. Somit erleichtert JAXR den Zugang zu vielfältigen BusinessRegistern und Repositories, wie UDDI und ebXML. Java APIs for WSDL (JWSDL) JWSDL erlaubt das Lesen, Generieren und Manipulieren von WSDL- Dokumenten, jedoch ist es nicht möglich mit Hilfe von JWSDL die Korrektheit von WSDL- Dokumenten zu Prüfen. SOAP with Attachments API for Java (SAAJ) Mit SAAJ können SOAP-Nachrichten gelesen, generiert und manipuliert werden. Das Versenden bzw. Empfangen von SOAP-Nachrichten erfolgt synchron und ist nur für Punkt-zu-PunktVerbindungen geeignet. Seite 2 von 14 JAXB: Java Architecture for XML Binding JAXB ist eine API, mit der Daten effizient zwischen einer XML-Repräsentation und einer Repräsentation als Objektgraph konvertiert werden können. Abbildung 2 zeigt die Zusammenhänge im JAXB Binding Prozess. • Marshalling. Als Marshalling wird der Prozess bezeichnet bei dem dein Java-Objekt-Baum in ein XML dokument überführt wird. • Unmarshalling. Dieser Prozess ist gegenläufig zu dem Marshalling-Prozess und übersetzt ein XMLDokument in einen Java-Objekt-Baum. • Validation. Hierbei wird das XML-Dokument auf DTD- Schema- Konformität geprüft. Abbildung 2: Zusammenhänge im JAXB Binding Prozess Java API for RESTful Web Services (JAX-RS) RESTful Web Services wird nur der Vollständigkeit halber erwähnt, da es Thema einer anderen Gruppe ist. In dieser Arbeit werden JAX-WS und JAX-RPC im Kapitel 2 und 3 ausführlicher erläutert, da der Fokus der Arbeit auf einem SOAP Web-Service liegt. JAX-RPC wird beschrieben, weil es der Vorgänger von JAX-WS ist und dieses darauf aufbaut. Seite 3 von 14 2 JAX-RPC: Java-API for XML-based RPC JAX-RPC ermöglicht die Implementierung von RPC-basierten (RPC – Remote Procedure Call) Web Services und Web Service Clients. Die API-Funktionalität wurde von einem Unternehmenskonsortium rund um Sun und unabhängigen Personen im Rahmen des Java Community Process erarbeitet und anschließend als Spezifikation und Referenz-Implementierung für die Öffentlichkeit zur Verfügung gestellt. 2.1 Kompatibilität JAX-RPC erfüllt mit der Kompatibilität über Server und Clients das wichtigste Anforderungskriterium an ein Web-Service. Web-Services, welche auf der Java-Plattform entwickelt und deployed werden, können von Clients verschiedener Programmiersprachen verwendet werden. Zusätzlich kann ein Client, welcher in Java geschrieben wurde, mit WebServices kommunizieren, welche auf anderen Plattformen entwickelt und deployed wurde. Ermöglicht wird diese Kompatibilität zum einen durch das Netzwerkprotokoll SOAP, mit dessen Hilfe Daten standardisiert zwischen Systemen ausgetauscht und Remote-Procedure-Calls durchgeführt werden können. Zum Anderen ermöglicht die Web-Services-Description-Language (WSDL) das standardisierte Beschreiben von Netzwerkdiensten (in diesem Fall Web-Services) auf Basis von XML. 2.2 Erstellung eines Web-Service Zum Erstellen eines Web-Service mit JAX-RPC werden im Grunde zwei Files benötigt. Zum einen eine Interface-Klasse welche die Methodenschnittstellen festlegt und eine Klasse, welche die im Interface definierten Methoden bzw. Schnittstellen implementiert. Veranschaulichen wollen wir dies anhand eines kleinen Codebeispiels. In dem Beispiel will ein Kaffee-Lieferant seinen Kunden seine Preisliste abrufen lassen sowie eine Schnittstelle zur Bestellung bieten. Schnittstellendefinition package coffees; import java.rmi.Remote; import java.rmi.RemoteException; public interface CoffeeOrderIF extends Remote { public Coffee [] getPriceList() throws RemoteException; Seite 4 von 14 public String orderCoffee(String coffeeName, int quantity) throws RemoteException; } Implementierung der Schnittstellen package coffees; public class CoffeeOrderImpl implements CoffeeOrderIF { public Coffee [] getPriceList() throws RemoteException; { //Methodenimplementierung für getPriceList } public String orderCoffee(String coffeeName, int quantity) throws RemoteException; { //Methodenimplementierung für orderCoffe } } Die Methode getPriceList liefert ein Array aus Coffee-Objekten zurück. Jedes dieser Objekte beinhaltet jeweils ein Feld für den Namen und ein Feld für den Preis. Über die Schnittstelle orderCoffee können Kunden mit Hilfe der zuvor abgefragten Produktnamen und der Angabe der Menge den jeweiligen Kaffeetyp bestellen. Zurückgegeben werden soll der Status der Bestellung. Entscheidend ist hierbei für eine Weiterverwendung als Web-Service, dass die Interface-Klasse als eine Unterklasse von java.rmi.Remote deklariert wird. Diese Klasse sowie die java.rmi.RemoteException für die Fehlerbehandlung müssen deshalb eingebunden werden. Nach der Erstellung des Interface und der Interface-Implementierung muss eine „helper class“ installiert werden. Das Web-Service wird in ein WAR-File (Web-Application-Archive) gepackt welches sich einfach verteilen und deployen lässt. 2.3 Erstellung eines Client package coffees; public class CoffeeClient { public static void main(String[] args) { try { CoffeeOrderIF coffeeOrder = new CoffeeOrderServiceImpl().getCoffeeOrderIF(); Coffee [] priceList = coffeeOrder.getPriceList(): for (int i = 0; i < priceList.length; i++) { System.out.print(priceList[i].getName() + " "); System.out.println(priceList[i].getPrice()); } } Seite 5 von 14 catch (Exception ex) { ex.printStackTrace(); } } } Im Client werden die zuvor definierten Methoden einfach aufgerufen. Die Klasse CoffeeOrderServiceImpl wird von dem Mapping-Tool erstellt. Über diese Klasse kann auf Methoden aus dem CoffeeOrderIF-Interface zugegriffen werden. 3 JAX-WS: Java-API for XML Web Services Die JAX-WS API dient der Implementierung von Endpoints und Clients für XML-basierte Web Services und ist eine Nachfolgetechnologie von JAX-RPC. Abbildung 3 zeigt den Aufbau des Service Endpoints (rechts) und des dazugehörigen Service Clients (links). Die Kommunikation erfolgt mittels SOAP-Nachrichten (in der Regel über HTTP). Für die Umwandlung der XMLDatentypen in Java-Klassen wird JAXB verwendet. Die Abbildung zeigt zusätzlich, dass der Client ein Stub- bzw. Proxy-Objekt benötigt. Dieses implementiert die Schnittstelle des Web-Services, das aus dem WSDL-Dokument generiert wird. Die Methoden des Services werden auf dem Stub- bzw. Proxy-Objekt ausgeführt (lokale Verfügbarkeit wird simuliert). Die Nachrichten-API leitet die Methodenaufrufe des Stub- bzw. Proxy-Objektes an den Web-Service weiter. Der Web-Service schickt die Antwort mit Hilfe der Nachrichten-API wieder zurück. [1] Abbildung 3: Web-Service Client und Web-Service Endpoint Seite 6 von 14 3.1 Implementation First vs. Contract First Die Erstellung eines Web Service Endpoints ist auf zwei Arten möglich. Zum Einen kann die Implementierung nach dem Motto „Implementation First“ ausgehend von bestehenden POJOs (Plain Old Java Object) erfolgen. Diese werden dann durch Annotationen zu einem Web Service erweitert. Im Gegensatz dazu kann auch in der umgekehrten Reihenfolge vorgegangen werden: Im Sinne von „Contract First“ werden ausgehend vom WSDL-Dokument die Web-Service Klassen erstellt. [1] 3.2 Annotationen Um zu definieren, wie Service-Operationen auf SOAP abgebildet werden sollen, werden Annotationen verwendet. Die wichtigsten Annotationen in JAX-WS werden in der Folge kurz vorgestellt [1]: • @WebService: Definition der Klasse, die das Web-Service implementiert. • @WebMethod: Festlegen der Methoden, die vom Web-Service exportiert werden sollen. • @SoapBinding: Festlegen des Nachrichtenmodus der zur Formatierung der SOAPNachrichten verwendet werden soll. • @WebParam: Definition der Methodenparameter (Name, Eingangsparameter, Ausgangsparameter und Übergangsparameter). • @WebResult: Definition des Rückgabewertes einer Methode. • @OneWay: Festlegen, dass Methodenaufruf asynchron durchgeführt werden soll. • @XmlType (JAXB): Festlegen der Eigenschaften von komplexen Typen. • @XmlElement (JAXB): Festlegen der Eigenschaften von Datenkomponenten. Bei den Annotationen können in einer Klammer Zusatzinformationen mittels Merkmalen definiert werden. Im folgenden Beispiel werden für das SOAP-Binding die Merkmale style und use gesetzt. Style gibt den Codierungsstil der Nachrichten an. Gültige Werte wären DOCUMENT und RPC. Use definiert die Formatierung der Nachrichten. Mögliche Werte sind LITERAL und ENCODED. [3] @SOAPBinding(style=Style.DOCUMENT, use=Use.LITERAL) Eine vollständige Übersicht aller Merkmale zu den Annotationen wird in [3] gegeben. Seite 7 von 14 3.3 Deployment 3.3.1 Standalone JAX-WS stellt eine minimale Server-Infrastruktur zur Verfügung. Dadurch kann ein Webserver der das Web-Service anbietet ohne Servlet Container (z.B. Tomcat, Glassfish) gestartet werden. JAXWS stellt dafür die Klasse Endpoint zur Verfügung, mit der Web-Service Endpunkte erzeugt und veröffentlicht werden können. Der Methode publish werden dafür die zu veröffentlichende URL und eine Web-Service Instanz übergeben. public static void main(String[] args) { Endpoint.publish("http://localhost:9202/contactmanager", new ContactManagerService()); } 3.3.2 Servlet Container Um ein Web-Service für das Deployment in einem Servlet Container vorzubereiten, müssen zwei XML-Dateien (innerhalb des WEB-INF Ordners) erstellt werden. In der Datei sun-jaxws.xml wird der Web-Service Endpunkt konfiguriert. Dieser wird auch als JAX-WS RI deployment descriptor bezeichnet. Weiters muss das Servlet im Standard web.xml deployment descriptor die Klasse WSServletContextListener als Listener und die Klasse WSServlet für den in sun-jaxws.xml definierten Endpunkt definieren. sun-jaxws.xml Beispiel: <?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="contact" implementation="service.ContactManagerService" url-pattern="/*"/> </endpoints> web.xml Beispiel: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/webapp_2_3.dtd"> <web-app> <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletCon textListener Seite 8 von 14 </listener-class> </listener> <servlet> <servlet-name>contact</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>contact</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 3.3.3 Abhängigkeiten JAX-WS ist Teil der Standard Distribution von Oracle Java. Ein Standalone-Server kann daher ohne zusätzliche Libaries ausgeführt werden. Ein Servlet Container hingegen hat keine JAX-WS Dependencies und die entsprechenden Libaries müssen daher entweder im Container (Pfad: {$TOMCAT}/lib) oder im Web Projekt (WEB-INF/lib) zur Verfügung gestellt werden. Die JAXWS RI Distribution kann unter http://jax-ws.java.net/ heruntergeladen werden. Folgende Libraries müssen hinzugefügt werden: • jaxb-impl.jar • jaxws-api.jar • jaxws-rt.jar • gmbal-api-only.jar • management-api.jar • stax-ex.jar • streambuffer.jar • policy.jar • ha-api.jar 3.4 Clients Es gibt zwei Möglichkeiten sich von einem Client zu einem Service zu verbinden. [1] In der ersten Variante kann ein statischer Stub erzeugt werden. Da diese Variante in der BeispielImplementierung (siehe Kapitel 4.3) Verwendung findet, wird auf eine nähere Erläuterung in diesem Kapitel verzichtet. Seite 9 von 14 In der zweiten Variante wird ein dynamischer Proxy erstellt. Der Proxy Code wird dabei aus dem WSDL-Dokument zur Laufzeit erzeugt. Beim Erzeugen der Service-Instanz wird der Methode create als erster Parameter die URL der WSDL und als zweiter Parameter ein QName-Objekt (mit Name und URL des Services) übergeben. QName steht dabei für 'qualified name'. [2] URL wsdlLocation = new URL("http://localhost:9202/contactmanager/ ContactManagerWebService?wsdl"); QName serviceName = new QName("http://localhost:9202/contactmanager", "ContactManagerService"); Service service = Service.create(wsdlLocation, serviceName); // get the dynamic proxy ContactMangager contactManagerProxy = service.getPort(ContactMangager.class); 4 Beispiel mit JAX-WS: Kontaktmanager 4.1 Idee Als Beispiel wurde ein Kontaktmanager realisiert. Dieser ermöglicht es Kontakte hinzuzufügen, zu löschen, zu suchen und es kann eine Liste aller gespeicherten Kontakte ausgegeben werden. Darum gibt es auf der Serverseite folgende Klassen: • Person – einzelne Personen die zur Kontaktliste hinzugefügt werden können • ContactList – hält eine Liste aller Kontakte die hinzugefügt wurden und stellt Operationen zum Hinzufügen, Entfernen und Suchen von Kontakten zur Verfügung sowie die Rückgabe der Kontaktliste • ContactManagerService – das Web-Service, das die Operationen der ContactList zur Verfügung stellt • Server – stellt den JAX-WS Endpoint zur Verfügung, damit ein Client auf das WebService zugreifen kann Auf der Clientseite gibt es lediglich die Klasse Client. Dies ist eine simple KonsolenAnwendung, welche sich zum Web-Service verbindet. Im folgenden werden die wichtigsten Implementierungsdetails dargestellt. Seite 10 von 14 4.2 Implementierung Serverseite 4.2.1 Web-Service Die Implementierung mittels JAX-WS gestaltet sich sehr einfach. Damit eine Klasse als WebService zur Verfügung gestellt werden kann muss lediglich die Annotation @WebService vor der Klassendefinition eingefügt werden: @WebService(name = "ContactManagerService", serviceName = "ContactManagerWebService", portName="ContactManagerWebServicePort") public class ContactManagerService { ... } Anschließend kann mittels dem Tool wsgen ein Web-Service von dieser Klasse erstellt werden. Üblicherweise wird dieser Schritt mit einem Ant-Build-Skript realisiert. Im folgenden Ausschnitt des Skripts stehen die grundsätzlichen Informationen zum Web-Service. Dies beinhaltet den Portnamen, Servicenamen und den Namen der Klasse, von der das Web-Service erstellt werden soll: <target name="create-service"> <antcall target="create-ws"> <param name="portname" value="{http://localhost:9202/contactmanager} ContactManagerWebServicePort" /> <param name="servicename value="{http://localhost:9202/contactmanager} ContactManagerWebService" /> <param name="classname" value="service.ContactManagerService" /> </antcall> </target> Im oberen Abschnitt sieht man anhand des <antcall>-Tags, dass ein anderer Abschnitt des Skripts mit den angegeben Informationen aufgerufen werden soll. Erst der folgende Schritt erstellt dann das Web-Service mit dem wsgen-Tool: <target name="create-ws"> <exec executable="C:\ProgramFiles\Java\jdk1.7.0_03\bin\wsgen.exe"> ... </exec> </target> Nach dem das Skript ausgeführt wurde ist das entsprechende WSDL-Dokument für das WebService vorhanden. 4.2.2 Server Die Server-Klasse bildet das Hauptprogramm, welches das WSDL-Dokument über eine URL zur Verfügung stellt: Seite 11 von 14 public static void main(String[] args) { Endpoint.publish("http://localhost:9202/contactmanager", new ContactManagerService()); System.out.println("Contact Manager-Server ready!"); } Die Klasse Endpoint wird vom Paket javax.xml.ws zur Verfügung gestellt und ermöglicht somit eine Standalone-Anwendung. Mit der Methode publish() wird dann an der angegebenen Adresse das gewünschte Web-Service deployed. Dieses steht nach dem Aufruf jedem zur Verfügung, der Zugriff auf diese Adresse hat. 4.3 Implementierung Clientseite Im Gegensatz zur Serverseite kann bei der Clientseite zuerst ein WSDL-Dokument abgerufen und die benötigten Klassen automatisch generiert werden. Dieser Abruf wird wieder mit einem AntBuild-Skript realisiert, welches nun das Tool wsimport verwendet. In diesem Fall gibt man zuerst an in was für ein Paket die Klassen generiert und welches WSDL geparst werden soll: <target name="create-service"> <antcall target="create-ws"> <param name="package" value="contactmanagerservice" /> <param name="wsdl.location" value="http://localhost:9202/contactmanager/ ContactManagerWebService?wsdl" /> </antcall> </target> Wie schon auf der Serverseite wird auch hier mit diesen Informationen dann das benötigte Tool, wsimport, aufgerufen: <target name="create-ws"> <exec executable="C:\Program Files\Java\jdk1.7.0_03\bin\wsimport.exe"> ... </exec> </target> Bei der Ausführung des Skripts wird für jede Methode, die im Web-Service vorhanden ist, eine Klasse generiert. Zusätzlich werden noch eine Factory und eine Web-Service Klasse generiert, damit auf die entsprechenden Funktionen zugegriffen werden kann. Natürlich wird auch eine Person-Klasse generiert, denn diese wäre sonst dem Client unbekannt. Im Falle des Beispiels werden somit folgende Klassen generiert: Seite 12 von 14 Abbildung 4: wsimport – generierte Klassen Für die Implementierung des Clients wurde die Variante eines statischen Stubs gewählt. Damit das Web-Service verwendet werden kann sind folgende zwei Aufrufe notwendig: ContactManagerWebService service = new ContactManagerWebService(); ContactManagerService s = service.getContactManagerWebServicePort(); Im ersten Schritt wird die generierte Web-Service Klasse instanziiert. Diese wird benötigt, damit im Anschluss der entsprechende Port zum Web-Service geöffnet werden kann und somit eine Instanz des serverseitig erstellten Web-Services erzeugt werden kann. Anschließend können die Methoden des Web-Services wie bei einem normalen Methodenaufruf bei einer Klasse verwendet werden: s.addPerson(firstName, lastName, phoneNumber); 5 Lessons Learned Für die Implementierung von Web Services und Clients in Java werden einfache APIs (z.B. JAXWS) zur Verfügung gestellt. Durch die Verwendung von verbindungslosen Transportprotokollen (wie z.B. HTTP) sind die Services auch für unsichere Netzwerkverbindungen (WLAN) geeignet. Die Serialisierung von Methodenaufrufen erfolgt nicht mit dem Standard- Serialisierungsmechanismus von Java. Eine Serialisierung wird nur für Properties (definiert durch Setter- und Getter-Methoden) und öffentliche Datenkomponenten vorgenommen. Private bzw. geschützte Datenkomponenten werden somit nicht übertragen. Da das Parsen der XML-Nachrichten (besonders bei Smart Clients) sehr rechenzeit-intensiv ist, ist der Zugriff auf Web Services die SOAP verwenden etwas langsam. [1] Seite 13 von 14 Abbildungsverzeichnis Abbildung 1: Überblick APIs...............................................................................................................1 Abbildung 2: Zusammenhänge im JAXB Binding Prozess.................................................................3 Abbildung 3: Web-Service Client und Web-Service Endpoint.............................................................6 Abbildung 4: wsimport – generierte Klassen.....................................................................................13 Quellen [1] Heinzelreiter J.: Web-Services: Implementierung mit Java. Foliensatz. 2012 [2] Dokumentation – Oracle: http://docs.oracle.com/cd/E15523_01/web.1111/e13734/proxy.htm, Zugriff am 23.5.2013 [3] IBM: http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic= %2Fcom.ibm.websphere.wsfep.multiplatform.doc%2Finfo%2Fae%2Fae %2Frwbs_jaxwsannotations.html, Zugriff am 22.5.2013 [4] Nagappan R.et al: Developing Java™ Web Services Dokumentation. 2003 Seite 14 von 14