A und O einer serviceorientierten Architektur sind sogenannte Web Services. Web Services sind technische Schnittstellen, die bestimmte Informationen und/oder Funktionen bereitstellen. Überwiegend werden Web Service zur Kommunikation zwischen verschiedenen Programmen, Systemen, etc. verwendet.
Ich behaupte, dass innerhalb von 15 Sekunden wirklich JEDER Java-Entwickler einen eignen Webservice schreiben kann! Anhand der legendären Rechteck-Klasse erläutere ich den „Code First“-Ansatz. Beachten Sie bitte, dass ich das JDK 6 benutze und mit Eclipse arbeite.
package main; public class RechteckService { public float berechneUmfang(float laenge, float breite) { return 2 * (laenge + breite); } public float berechneInhalt(float laenge, float breite) { return laenge * breite; } }
Als aller erstes schreibe ich über die Klasse die Annotation „@WebService“. Zusätzlich gebe ich folgende Parameter an:
package main; import javax.jws.WebService; @WebService(name = "RechteckWebService", serviceName = "RechteckWebService", portName = "RechteckWebServicePort", targetNamespace = "http://www.axxg.de/ws/rechteck") public class RechteckService { public float berechneUmfang(float laenge, float breite) { return 2 * (laenge + breite); } public float berechneInhalt(float laenge, float breite) { return laenge * breite; } }
Die Web Service-Klasse ist fertig. Nicht schön, aber das kann ich später noch ändern. Nun geht es um das Ant-Build-File. Folgende Parameter müssen angepasst werden:
<project name="RechteckWebService" default="release" basedir="."> <property name="jaxws-version" value="2.0" /> <property name="jar.file" value="${ant.project.name}.jar"/> <property name="generated" value="generated" /> <property name="generated.src" value="${generated}/src" /> <property name="generated.wsdl" value="${generated}/wsdl" /> <property name="classes.dir" value="bin" /> <property name="wsgen.exec" value="C:/Program Files (x86)/Java/jdk1.6.0_16/bin/wsgen" /> <target name="clean"> <delete failonerror="false" includeemptydirs="true"> <fileset dir="${generated.src}" /> <fileset dir="${generated.wsdl}" /> <fileset dir="release" /> </delete> <mkdir dir="${generated}" /> <mkdir dir="${generated.src}" /> <mkdir dir="${generated.wsdl}" /> <mkdir dir="release"/> </target> <target name="release" depends="clean, create-service, jar" /> <target name="create-service"> <antcall target="create-ws"> <param name="portname" value="{http://www.axxg.de/ws/rechteck}RechteckWebServicePort" /> <param name="servicename" value="{http://www.axxg.de/ws/rechteck}RechteckWebService" /> <param name="classname" value="main.RechteckService" /> </antcall> </target> <target name="jar"> <jar destfile="release/${jar.file}"> <zipfileset dir="${classes.dir}" includes="**/*.*" /> </jar> </target> <target name="create-ws"> <exec executable="${wsgen.exec}"> <arg value="-wsdl" /> <arg value="-keep" /> <arg value="-classpath" /> <arg value="${classes.dir}" /> <arg value="-r" /> <arg value="${generated.wsdl}" /> <arg value="-s" /> <arg value="${generated.src}" /> <arg value="-d" /> <arg value="${classes.dir}" /> <arg value="-servicename" /> <arg value="${servicename}" /> <arg value="-portname" /> <arg value="${portname}" /> <arg value="${classname}" /> </exec> </target> </project>
Nun muss ich das Projekt nur noch bauen und …
…FERTIG!
Sollte man etwas mehr Zeit haben, empfehle ich noch die Annotationen @WebResult und @WebParam anzuwenden. Diese Annotationen definieren die Übergabeparameter und den Rückgabetyp genauer!
package main; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService(name = "RechteckWebService", serviceName = "RechteckWebService", portName = "RechteckWebServicePort", targetNamespace = "http://www.axxg.de/ws/rechteck") public class RechteckService { public @WebResult(name= "Umfang") float berechneUmfang( @WebParam(name = "Laenge") float laenge, @WebParam(name = "Breite") float breite) { return 2 * (laenge + breite); } public @WebResult(name= "Flaecheninhalt")float berechneInhalt( @WebParam(name = "Laenge") float laenge, @WebParam(name = "Breite") float breite) { return laenge * breite; } }
<xs:element name="berechneInhalt" type="tns:berechneInhalt"/>
<xs:element name="berechneInhaltResponse" type="tns:berechneInhaltResponse"/>
<xs:element name="berechneUmfang" type="tns:berechneUmfang"/>
<xs:element name="berechneUmfangResponse" type="tns:berechneUmfangResponse"/>
<xs:complexType name="berechneInhalt"> <xs:sequence> <xs:element name="Laenge" type="xs:float"/> <xs:element name="Breite" type="xs:float"/> </xs:sequence> </xs:complexType>
<xs:complexType name="berechneInhaltResponse"> <xs:sequence> <xs:element name="Flaecheninhalt" type="xs:float"/> </xs:sequence> </xs:complexType>
<xs:complexType name="berechneUmfang"> <xs:sequence> <xs:element name="Laenge" type="xs:float"/> <xs:element name="Breite" type="xs:float"/> </xs:sequence> </xs:complexType>
<xs:complexType name="berechneUmfangResponse"> <xs:sequence> <xs:element name="Umfang" type="xs:float"/> </xs:sequence> </xs:complexType> </xs:schema> [/xml]
[download id=“7″ format=“2″]
In einem weiteren Artikel (Java: …und in weiteren 20 Sekunden einen Web Service veröffentlichen/bereitstellen ohne Applikationserver!) habe ich beschrieben, wie man z.B. diesen Web Service ohne Applikationsserver veröffentlicht bzw bereitstellt. Außerdem brauch man noch einen Web Service Client:
…Wem das zu viel ist, dem sei SOAP UI zu empfehlen.
Copyright © 2011 AxxG – Alexander Gräsel
Hallo Alexander
Vielen dank für dieses Tutorial, das war genau, was ich suchte für einen „Quick-Start“.
Lukas
Schön, dass ich weiterhelfen konnte^^
Sehr tolle und schnelle Erklärung! Ich dachte bisher immer da steckt sonst was für Magie dahinter 🙂 … vielen Dank!
Echt super! 🙂
Einzig wie man zur WSDL und zur XSD kommt bleibt mir ein Tätsel… Ich bin neu auf diesem Gebiet (habe früher viel Java programmiert) und kann nicht nachvollziehen, wie die WSDL generiert wird – kann mir da jemand auf die Sprünge helfen? 🙂
Hallo Bernhard,
danke für das Lob^^
Was mein Ant-Skript letztlich macht ist ein Programm namens „wsgen.exec“ aufzurufen.
Diese Programm muss mit bestimmten Parametern gestartet werden und generiert dir die WSDL- und XSD-Dateien.
Du kannst ja mal das Programm in einer normalen CMD öffnen;-)