Mit JAXB einfach von XML Daten zu Java Objekten
Eine Variante mit XML in Java zu arbeiten ist die Java Architecture for XML Binding, besser bekannt unter JAXB. Mit JAXB kann man sehr einfach Java Objekte als XML Datei speichern (marshal) und umgekehrt eine XML Datei wieder in ein Java Objekt laden (unmarshal). So kann man z.B. Daten sehr einfach austauschen oder persistieren. Implementiert man einen Webservice mit JAX-WS (Java API for XML – Web Services) werden z.B. die Daten die ausgetauscht werden mit JAX-B Annotationen versehen und via XML ausgetauscht. Das Umwandeln des Java Objekts zu XML und wieder zurück übernimmt dabei JAXB.
In meinem Anwendungsfall habe ich eine Online Schnittstelle die mir die Ergebnisse zu Spieltagen der Bundesliga als XML liefert. Ziel ist es diese Informationen so einfach wie möglich in meine Java Anwendung zu bekommen. Mit Hilfe von JAXB sollen diese XML Informationen zu Java Objekten umgewandelt werden, so dass man damit einfach weiterarbeiten kann. Dieser Vorgang wird unmarshal genannt und erzeugt eine Objekt Struktur die den Inhalt und den Aufbau der XML Datei repräsentiert.
Die erzeugte Objektstruktur ist aber kein DOM basierter Baum, wie manchmal angenommen wird, sondern ein normale Java Objekte, die wieder Referenzen auf weitere Java Objekte haben.
Die XML die ich geliefert bekomme und zu Java Objekten mit JAXB unmarshallen möchte sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?> <spieltag> <game> <spieltag>28</spieltag> <nummer>1</nummer> <beginn>2010-03-26 20:30:00</beginn> <mannschaft_heim><![CDATA[VfL Bochum]]></mannschaft_heim> <mannschaft_gast><![CDATA[Eintracht Frankfurt]]></mannschaft_gast> <tore_heim_halbzeit>1</tore_heim_halbzeit> <tore_gast_halbzeit>1</tore_gast_halbzeit> <tore_heim_ergebnis>1</tore_heim_ergebnis> <tore_gast_ergebnis>2</tore_gast_ergebnis> </game> <game> <spieltag>28</spieltag> <nummer>2</nummer> <beginn>2010-03-27 15:30:00</beginn> <mannschaft_heim><![CDATA[Bayern München]]></mannschaft_heim> <mannschaft_gast><![CDATA[VfB Stuttgart]]></mannschaft_gast> <tore_heim_halbzeit></tore_heim_halbzeit> <tore_gast_halbzeit></tore_gast_halbzeit> <tore_heim_ergebnis></tore_heim_ergebnis> <tore_gast_ergebnis></tore_gast_ergebnis> </game> ... </spieltag>
Um mit JAXB von der XML Datei zu Java Objekten zu gelangen benötigt man die Beschreibung des Mappings mit JAXB Annotationen in Java Klassen. Da in diesem Fall die XML Datei vorliegt ist der einfachste Weg sich die Klassen mit den Annotationen generieren zu lassen. Dazu benötigt man das XML Schema zu zu der XML Datei.
In meinem Fall habe noch kein Schema für diese XML Struktur. Eines jetzt von Hand zu erstellen wäre möglich aber sehr aufwendig. An dieser Stelle kommt das kleine Java Tool Namens Trang ins Spiel.
Dazu die letzte Version aus 2008 herunterladen (Direktlink) und an einem Ort der Wahl entpacken. Anschließend die XML Datei der Einfachheit halber auch mit in diese Ordner kopieren und darauf achten, dass sie mit UTF-8 enkodiert ist. Um das Schema zu erzeugen einfach das trang.jar mit zwei Parametern aufrufen:
Das von Trang generierte Schema sieht bei mir wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="spieltag"> <xs:complexType mixed="true"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="game"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="game"> <xs:complexType> <xs:sequence> <xs:element ref="spieltag"/> <xs:element ref="nummer"/> <xs:element ref="beginn"/> <xs:element ref="mannschaft_heim"/> <xs:element ref="mannschaft_gast"/> <xs:element ref="tore_heim_halbzeit"/> <xs:element ref="tore_gast_halbzeit"/> <xs:element ref="tore_heim_ergebnis"/> <xs:element ref="tore_gast_ergebnis"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="nummer" type="xs:integer"/> <xs:element name="beginn" type="xs:string"/> <xs:element name="mannschaft_heim" type="xs:string"/> <xs:element name="mannschaft_gast" type="xs:string"/> <xs:element name="tore_heim_halbzeit" type="xs:string"/> <xs:element name="tore_gast_halbzeit" type="xs:string"/> <xs:element name="tore_heim_ergebnis" type="xs:string"/> <xs:element name="tore_gast_ergebnis" type="xs:string"/> </xs:schema>
Das JDK liefert einen Binding Compiler für JAXB mit dem Namen XJC mit aus der im /bin Verzeichnis unterhalb der Java Runtime zu finden ist. Damit kann man aus einem XML Schema die entsprechenden Java Klassen generieren lassen, aus denen dann beim späteren unmarshal Prozess die Java Objekte erstellt werden.
Der Aufruf des Binding Compiler verwendet in diesem Beispiel zwei Parameter. Der Paramter d definiert das Verzeichnis in dem die Klassen gespeichert werden sollen, bei mir das Verzeichnis src relativ zum aktuellen Verzeichnis, und der Paramter p definiert das Java Package in dem die Klassen liegen sollen. Als letztes wird das XML Schema angegeben aus dem die Java Klassen generiert werden sollen:
Für die obige XML Datei wurden drei Klassen generiert:
Im folgenden der interessante Teil aus der klasse Game mit JAXB Annotationen:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "spieltag", "nummer", "beginn", "mannschaftHeim", "mannschaftGast", "toreHeimHalbzeit", "toreGastHalbzeit", "toreHeimErgebnis", "toreGastErgebnis" }) @XmlRootElement(name = "game") public class Game { @XmlElement(required = true) protected Spieltag spieltag; @XmlElement(required = true) protected BigInteger nummer; @XmlElement(required = true) protected String beginn; @XmlElement(name = "mannschaft_heim", required = true) protected String mannschaftHeim; @XmlElement(name = "mannschaft_gast", required = true) protected String mannschaftGast; @XmlElement(name = "tore_heim_halbzeit", required = true) protected String toreHeimHalbzeit; @XmlElement(name = "tore_gast_halbzeit", required = true) protected String toreGastHalbzeit; @XmlElement(name = "tore_heim_ergebnis", required = true) protected String toreHeimErgebnis; @XmlElement(name = "tore_gast_ergebnis", required = true) protected String toreGastErgebnis; // Getter und Setter }
Man kann an diesem Beispiel sehr schön das Mapping zwischen XML Element und Attribut mit der Annotation @XmlElement sehen:
Es gibt noch weitaus komplizierte JAXB Konfigurationen von daher empfiehlt es sich eigentlich immer sich die fehlende Gegenseite, wie in diesem Beispiel die Java Klassen, generieren zu lassen. Auch der andere Weg, das marshalling von Java Objektbäumen zu einer XML Datei, lässt sich sehr einfach generieren.
Nun kommt der wichtigste Teil des Tutorials, nämlich die eigentliche Anwendung von JAXB. Die XML Datei soll als Java Objektstruktur zur Verfügung stehen, so dass die Daten einfach weiterverarbeitet werden können. Dieser Weg wird, wie am Anfang beschrieben, unmarshal genannt. Bis zum Java Objekt sind es an dieser Stelle nur noch drei Zeilen:
- JAXBContext Objekt erstellen, welches einem Zugriff auf die JAXB API ermöglicht. Dabei wird als Parameter ein oder mehrere Packages zu den generierten Klassen mit den JAXB Annotationen benötigt:
JAXBContext jc = JAXBContext.newInstance("de.javathreads.jaxb"); - Unmarshaller Objekt vom JAXBContext erstellen:
Unmarshaller unmarshaller = jc.createUnmarshaller(); - Die
unmarshal()Methode aus dem Unmarshaller Objekt aufrufem um den unmarshalling Prozess zu starten. Als Parameter wird dabei die zu parsende XML Datei erwartet und als Rückgabewert erhält man das entsprechende Objekt für das Root Element der XML Datei. In meinem Beispiel ist das die KlasseSpieltag, welche vom Unmarshaller zurückgegeben wird:Spieltag sp = (Spieltag) unmarshaller.unmarshal(new File("D:\\projects\\TipResultParser\\xml\\spieltag.xml"));
Jetzt kann man direkt mit der Objektrepräsentation der XML Datei auf Java Ebene arbeiten. Noch einmal der Hinweis, dass es sich bei diesen Objekten nicht um ein DOM basierten Baum handelt sondern um reine Content-Objekte, welche den Inhalt und die Struktur der XML Datei wiedergeben.
Als letztes noch mal der komplette Code an einem Stück für die bessere Übersicht:
package de.javathreads.jaxb; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; public class Main { public static void main(String[] args) throws Exception { // Package JAXBContext jc = JAXBContext.newInstance("de.javathreads.jaxb"); Unmarshaller unmarshaller = jc.createUnmarshaller(); Spieltag sp = (Spieltag) unmarshaller.unmarshal(new File("D:\\projects\\TipResultParser\\xml\\spieltag.xml")); for (int i = 0; i < sp.getContent().size(); i++) { if (sp.getContent().get(i) instanceof Game) { Game g = (Game) sp.getContent().get(i); System.out.println("Spiel: " + g.getNummer()); } } } }
Ausgabe auf der Konsole:
Spiel: 2
…
Hinweis zu dem Code bezüglich der Prüfung mit instanceof Game. Die XML Schnittstelle liefert den Inhalt formatiert und somit mit Sonderzeichen wie “\t” und “\n” zurück, so dass diese Zeichen als Content direkt hinter dem XML Tag beim unmarshal Prozess erkannt wurden. Die Liste, die mir sp.getContent() zurückliefert, enthält abwechselnd den String “\t\t\n” und ein Game Objekt. Das ist aber nicht die Regel und ich muss mal schauen ob ich dieses Verhalten nicht noch irgendwie abstellen kann.
Die Grafiken wurden aus dem offiziellen Sun Artikel “Java Architecture for XML Binding (JAXB)” entnommen. Dort findet man auch eine ausführliche Anleitung für den marhall Vorgang, wenn man Java Objekte zu einer XML Datei marshallen möchte.
Kostenloses Buch für die Android Entwicklung
Ein kleiner Hinweis für alle die mal einen kleinen Einblick in die Android Entwicklung erhalten möchten ist das kostenlose Buch “Android – Grundlagen und Programmierung” (DPunkt Verlag) von Arno Becker und Marcus Pant als PDF.
Als kleinen Haken könnte man evtl. sehen, dass die Beispiele in dem Buch sich allesamt auf das Android SDK 1.1 beziehen. Auf der Webseite der Autoren sind die Beispiele für das Android SDK 1.5 aktualisiert vorhanden.
Die neue Auflage des Buches mit dem Titel “Android 2″ erscheint im Mai 2010 und basiert dann auf dem aktuellen SDK 2.1. Somit ist diese kostenlose Herausgabe des Buches als PDF Version ein geschickte Werbung.
Codequalität in der Softwareentwicklung..
Allein der Wille zählt!
History of Web Frameworks
Eine wirklich interessante Grafik wurde vor kurzem auf flickr unter dem Titel “History of Web Frameworks” veröffentlicht. Das Besondere an der Grafik ist die zeitliche Anordnung der verschiedenen Frameworks. Darunter sind auch die gängigen Java Technologien, angefangen bei Tomcat 3.0 und Servlet 2.2 aus dem Jahr 1999 bis hin zu JSF 2.0 und Spring 3.0 aus dem Jahr 2009, zu finden:
Wer eine größere Version sehen oder herunterladen möchte sollte sich diese direkt auf flickr.com ansehen.
JavaFX ist offizielle Rich Client Technologie der Olympischen Winterspiele 2010
Ein interessanter Marketing-Schachzug in Sachen Rich Client Technologien ist Sun Oracle mit JavaFX im Bezug auf die aktuell laufenden Olympischen Winterspiele gelungen denn sie weisen sich als die offiziell verwendete Rich Client Technologie für die vancouver2010.com Webseite aus. Man findet sogar ein Werbevideo auf der eigens eingerichteten Unterseite auf javafx.com/wintergames:
Auf den ersten Blick der offiziellen Winterspiele Webseite sieht man JavaFX nicht. Erst in der Medaillenübersicht in dem Unterpunkt Geo View wird JavaFX verwendet. Die Applikation heißt “Medal Wheel” und in Ihrem Story Board (PDF Direktlink) heißt es wie folgt:
The applications built for the Vancouver 2010 Winter Games combine the power of Java™ technology with the innovative data visualization and exploration capabilities of the JavaFX platform.
Schaut man sich die Medal Wheel Anwendung an so sieht man direkt im Einstieg grafisch hervorgehoben die Verteilung der Medaillen:
Klickt man anschließend auf ein Land erhält man noch weitere Information in einem Informationsrad:
Auch hier kann man noch einen Schritt tiefer und zusätzliche Informationen zu den verschiedenen “Nachbarn” des Landes erfahren:
Neben der aktuellen Medaillenverteilung kann man auch alle historischen Ergebnisse studieren und grafisch auf sich wirken lassen.
Des Weiteren wird auch noch von einem Results Ticker Widget für den Desktop berichtet, allerdings habe ich dieses bis jetzt nicht finden können.
Oracle hat dafür auch extra eine Pressemitteilung veröffentlicht. Und wem das auch nicht genug ist der sollte sich zudem noch die Success Story als PDF herunterladen und durchlesen.
Zum Abschluss noch ein kurzes Wort zu JavaFX. JavaFX könnte man als Sun’s Antwort auf Adobe Flex oder Microsoft Silverlight sehen und positioniert sich im Sektor der Rich Client Plattformen. Dabei beschränkt sich die Darstellung von JavaFX Applikationen nicht nur auf Browser sondern soll auf allen Endgeräten, vor allem mobilen, direkt verfügbar sein. Für den Interessierten an dieser Stelle noch der Hinweis auf die DZone Refcardz mit der JavaFX Ausgabe:
Insgesamt kann man wohl sagen, dass es mit dieser Medal Wheel Anwendung ein großer Marketing-Coup gelungen ist. So erwartet man mehrere Millionen Zugriffe auf der Webseite und man darf gespannt sein wie das Fazit, falls eins gezogen wird, ausfällt.
Wir Entwickler brauchen einfach mehr Unterstützung..
.. mehr Verständnis oder einfach mal eine Umarmung, wie auch das Video “Hug a developer today” sehr schön aufzeigt:
Falls einem das Video doch zu theatralisch ist dann lieber jeden Morgen mit der folgenden kleinen Motivation, ganz speziell für dich Entwickler, von Steve Ballmer aufstehen:
Die Welt als Entwickler könnte so schön sein..
;)
JAXenter Umfrage – Welche Java IDE benutzt du?
Eine ganz interessante QuickVote Umfrage von JAXenter mit dem Titel 2 “Welche ist Ihre bevorzugte Java IDE?“. Bei dem Ergebnis ist vor allem erstaunlich bzw. unerwartet, dass NetBeans doch so nah an Eclipse liegt.
In einem Kommentar bei dem Hinweis von Adam Bien auf dieses Quickvote verweist jemand auf die Entwicklung bei Google. Schaut man sich also diese Entwicklung bei Google innerhalb Deutschlands an so erhält man noch einen deutlicheren Vorsprung von Eclipse, der allerdings über die letzten Jahre deutlich weniger geworden ist:
Die Charts auf Google Insights for Search kann man auch einbetten, was ich doch direkt mal ausprobieren musste:
Insgesamt kann man an der Umfrage und dem Chart gut erkennen, dass Eclipse nicht mehr ganz die alleinige Herrschaft hat bzw. sie langsam verliert. Ich hatte vor Jahren mal NetBeans ausprobiert, war damals aber nicht so begeistert und bin deswegen auf Eclipse umgestiegen. Auch in meinen bisherigen Projekten wurde eigentlich ausschließlich Eclipse verwendet. Vielleicht sollte man sich aber dennoch mal wieder NetBeans anschauen. Aktuell habe ich davon gelesen, dass die JSF 2 Unterstützung darin schon sehr gut sein soll. Ich werde wohl dennoch erst einmal weiterhin ein Unterstützer von Eclipse sein =).
(via Adam Bien)
Java EE 6 – Web Profile Technologien
Die Java EE 6 Spezifikation, welche unter dem JSR 316 läuft, hat Ende des letzten Jahres die finale Abstimmung hinter sich gebracht und bestanden. Auch die Kommentare, z.B. von Apache die dagegen gestimmt haben, sind mal ganz interessant durchzulesen aber hier erst einmal der Abstimmungs Screenshot:
Für mich persönlich finde ich besonders interessant, dass es eine eigene Java EE Web Profile Spezifikation gibt. Und diese beinhaltet eine ganze Menge an interessanten JSRs:
- Servlet 3.0 (JSR 315)
- JavaServer Pages (JSP) 2.2 (JSR 245)
- Expression Language (EL) 2.2 (JSR 245)
- Debugging Support for Other Languages 1.0 (JSR 45)
- Standard Tag Library for JavaServer Pages (JSTL) 1.2 (JSR 52)
- JavaServer Faces (JSF) 2.0 (JSR 314)
- Common Annotations for Java Platform 1.1 (JSR 250)
- Enterprise JavaBeans (EJB) 3.1 Lite (JSR 318)
- Java Transaction API (JTA) 1.1 (JSR 907)
- Java Persistence API (JPA) 2.0 (JSR 317)
- Bean Validation 1.0 (JSR 303)
- Managed Beans 1.0 (JSR 316)
- Interceptors 1.1 (JSR 318)
- Contexts and Dependency Injection for Java EE platform 1.0 (JSR 299)
- Dependency Injection for Java 1.0 (JSR 330)
Folgende schöne Grafik habe ich noch in einer Präsentation gefunden, welche die Entwicklung der Java EE Spezifikationen in der Vergangenheit und Heute anschaulich darstellt:
Die Präsentation hat die Überschrift “Java EE 6 : Paving The Path For The Future” und beinhaltet Informationen über die Technologien die in Java EE 6 stecken:
Contexts and Dependency Injection for the Java EE Platform Spickzettel
Endlich mal wieder eine, aus meiner Sicht, wirklich nützliche DZone Refcard (Spickzettel) mit der Überschrift Contexts and Dependency Injection for the Java EE Platform, was auch unter dem JSR 299 bekannt ist und in Java EE 6 mit einfließt. Konkret behandelt es die Context and Dependency Injection (CDI) Implementierung von JBoss mit dem Namen Weld.
Wie immer bei den DZone Refcardz gilt, dass man sich registrieren muss um das PDF herunterladen zu können oder eben einfach direkt online ansehen. Alternativ hier einfach ein Kommentar hinterlassen oder mich kontaktieren und ich schicke es auch direkt zu.
Design Pattern Quiz
Wer sein Informatiker Wissen mal wieder prüfen möchte kann sich dem Design Pattern Quiz annehmen. Dabei nimmt man aus der linken Spalte ein Design Pattern und ordnet sich rechts per Drag & Drop einer Design Pattern Kategorie zu. so gehört z.B. das Design Pattern “Factory Method” der Kategorie “Creational Pattern” mit der Beschreibung “Creates an Instance of several derived classes” an und leuchtet nach dem Droppen grün auf. Ist eine Zuordnung falsch wird der Balken rot aber man kann das Element wieder aufnehmen und es noch einmal probieren.
Eine nette kleine Spielerei um sein Design Pattern Wissen mal wieder aufzufrischen.

















