SOAP oder REST Web Service definieren immer eine Schnittstelle zu einem bestimmten Softwaresystem. Jedoch kann sich die Implementierung hinter dieser Schnittstelle jederzeit ändern. Mithilfe einer einzelnen Methode sollte man stets die aktuelle Version der Implementierung einsehen können. In diesem Beitrag zeige ich, wie so eine Methode aussehen kann und was sie beinhalten sollte.
Wie bereits geschrieben, geht es um den Versionsstand der Implementierung eines Web Services. Hierbei gibt es ein großes Problem: Wer macht das für uns?
Die Antwort auf diese Frage lautet: „ICH – dein Buildsystem!!!“. Je nach Buildsystem(ANT, Maven, etc.) gibt es diverse Möglichkeiten Informationen über einen Build abzuspeichern. Diese Informationen können z.B. in einer Methode des Web Services ausgelesen und dem Client gesendet werden. Da ich sehr gerne ANT verwende, zeige ich hier ein kleines Beispiel:
Wer keine Ahnung von ANT hat: kurze Einführung in das Java-Buildsystem ANT von Vogella….
Das folgende Build-Target, namens „releaseinfo„, sammelt diese Informationen:
… und speichert sie in eine Datei (releaseInfo.properties). ACHTUNG – der Dateiname und Pfad wurde vorab in der Build.xml oben definiert (Siehe „gesamte Build.xml„).
<target name="releaseinfo"> <!-- Buildnummer von ANT verwenden --> <buildnumber file="${generated.releaseinfo}"></buildnumber> <!-- Umgebungsvariable auslesen--> <property environment="env"></property> <propertyfile file="${generated.releaseinfo}" comment="This file is automatically generated - DO NOT EDIT"> <entry key="projektname" value="${ant.project.name}"></entry> <entry key="antver" value="${ant.version}"></entry> <entry key="builddate" type="date" pattern="dd.MM.yyyy HH:mm:ss" value="now"></entry> <entry key="javaver" value="${ant.java.version}"></entry> <!-- Umgebungsvariable auslesen (auf Gross-/Kleinschreibung achten!) --> <!-- Koennen je nach Betriebssystem variieren (XP-Variante) --> <entry key="user" value="${env.USERNAME}"></entry> <entry key="pcname" value="${env.COMPUTERNAME}"></entry> <entry key="basedir" value="${basedir}"></entry> </propertyfile> <copy todir="${classes.dir}"> <fileset file="${generated.releaseinfo}"></fileset> </copy> </target>
Ab jetzt wird automatisch eine releaseinfo.properties erzeugt, die nur noch in einer Web Service Methode ausgelesen werden muss. Hierbei empfehle ich eine unternehmensweite Konvention aufzustellen, wie zum Beispiel:
public @WebResult(name= "ReleaseInfo")String getReleaseInfo() { String retStr = null; try { StringWriter strWr = new StringWriter(); PrintWriter printWr = new PrintWriter(strWr); // von ANT generierte Properties-Datei einlesen InputStreamReader inputstrReader = new InputStreamReader(RechteckService.class.getClassLoader().getResourceAsStream("releaseInfo.properties")); Properties releaseInfoProp = new Properties(); releaseInfoProp.load(inputstrReader); printWr.println("Projektname: " + releaseInfoProp.getProperty("projektname")); printWr.println("Version: " + releaseInfoProp.getProperty("build.number")); printWr.println("Builddatum: " + releaseInfoProp.getProperty("builddate")); printWr.println("Buildverzeichnis: " + releaseInfoProp.getProperty("basedir")); printWr.println("ANT Version: " + releaseInfoProp.getProperty("antver")); printWr.println("Java Version: " + releaseInfoProp.getProperty("javaver")); printWr.println("User: " + releaseInfoProp.getProperty("user")); printWr.println("Workstation: " + releaseInfoProp.getProperty("pcname")); printWr.close(); strWr.close(); inputstrReader.close(); retStr = strWr.toString(); } catch(Exception e){ retStr = "Unerwarteter Fehler beim Lesen der Releaseinfo: " + e.toString(); //e.printStackTrace(); } return retStr; }
<s:envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <s:body> <ns2:getreleaseinforesponse xmlns:ns2="http://www.axxg.de/ws/rechteck"> <releaseinfo> Projektname: RechteckWebService Version: 13 Builddatum: 09.10.2012 11:11:43 Buildverzeichnis: C:\Dokumente und Einstellungen\AxxG\Desktop\RechteckWS ANT Version: Apache Ant(TM) version 1.8.2 compiled on December 20 2010 Java Version: 1.6 User: Alexander Workstation: AxxG-PC </releaseinfo> </ns2:getreleaseinforesponse> </s:body> </s:envelope>
[download id=“12″ format=“2″]
Copyright © 2012 AxxG – Alexander Gräsel
Sehr schön!
Du könntest in Deinem Beispiel auch den PrintWriter und die println()-Methode verwenden. Dann wäre der Code noch etwas übersichtlicher.