Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Java API for XML Binding Eine Einführung Tim Speier Fachbereich MNI Fachhochschule Gießen-Friedberg 24. Juni 2010 1 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XM und Java – Teil 1: Aufgabenstellung Library • Aufgabenstellung: In einem XML-Dokument werden die Bücher und deren Autoren einer Bibliothek erfasst. Dazu gehören (stark vereinfacht) : 1..* • Bibliothek • Buch Book - title: String isbn: int • Autor 0..* Eine in Java programmierte Anwendung soll nun die Datenbank auslesen und den Inhalt darstellen, evtl. modifizieren und wieder als XML-Dokument speichern. 1..* Author - sn: String gn: String 2 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XML – Auffrischung • Dokument (XML) • Hierarchisch strukturierte Daten in Textform • Besteht aus Deklaration, Elementen, Attributen und Daten • Schema (XSD) • Beschreibt die Struktur der XML-Dokumente • Ist selbst auch ein XML-Dokument • Wohlgeformt: Dokument ist gemäß XML aufgebaut • Gültig: Dokument folgt einem vorgegebenen Schema 3 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XM und Java – Teil 2: XML-Schema 1 2 3 4 5 6 <x s : c o m p l e x T y p e name=” A u t h o r ”> <x s : s e q u e n c e> <x s : e l e m e n t name=” s n ” t y p e=” x s : s t r i n g ” /> <x s : e l e m e n t name=” gn ” t y p e=” x s : s t r i n g ” /> </ x s : s e q u e n c e> </ x s : c o m p l e x T y p e> 7 8 9 10 11 12 13 14 <x s : c o m p l e x T y p e name=” Book ”> <x s : s e q u e n c e> <x s : e l e m e n t name=” a u t h o r s ” t y p e=” A u t h o r ” m i n O c c u r s=” 1 ” /> </ x s : s e q u e n c e> < x s : a t t r i b u t e name=” t i t l e ” t y p e=” x s : s t r i n g ” /> < x s : a t t r i b u t e name=” i s b n ” t y p e=” x s : l o n g ” /> </ x s : c o m p l e x T y p e> 15 16 17 18 19 20 21 22 <x s : e l e m e n t name=” L i b r a r y ”> <x s : c o m p l e x T y p e> <x s : s e q u e n c e> <x s : e l e m e n t name =” b o o k s ” t y p e=” Book ” m i n O c c u r s=” 0 ” maxOccurs=” unbounded ” /> </ x s : s e q u e n c e> </ x s : c o m p l e x T y p e> </ x s : e l e m e n t> 4 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XML und Java – Teil 3: XML-Dokument 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <L i b r a r y> <books> <Book t i t l e =” E n t e r p r i s e I n t e g r a t i o n P a t t e r n s ” i s b n=” 0321200683 ”> <a u t h o r s> <Author><gn>G r e g o r</ gn><sn>Hohpe</ sn></ Author> <Author><gn>Booby</ gn><sn>Woolf</ sn></ Author> </ a u t h o r s> </Book> <Book t i t l e =” J a v a SOA Cookbook ” i s b n=” 0321200683 ”> <a u t h o r s> <Author><gn>Eben</ gn><sn>H e w i t t</ sn></ Author> </ a u t h o r s> </Book> </ books> </ L i b r a r y> 5 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XML und Java – Teil 4: Klassische Anwendung 1. SAX – Simple API for XML • Sequentielles Lesen des XML-Dokuments • Auslösen von Ereignissen wenn ein Element gefunden wird 2. DOM – Document Object Model • Aufbau der Daten als Baumstruktur im Speicher 3. Weitere • StAX – Streaming API for XML • XPath – XML Path Language 6 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen XML und Java – Teil 5: JAXB-Anwendung 1 Libary lib =... 2 3 f o r ( Book book : l i b . g e t B o o k s ( ) ) { 4 S t r i n g t i t l e =book . g e t T i t l e ( ) ; l o n g i s b n=book . g e t I s b n ( ) ; 5 6 7 System . o u t . p r i n t l n ( ” Found book : ”+ t i t l e +i s b n ) ; 8 9 f o r ( A u t h o r a u t h o r : book . g e t A u t h o r s ( ) ) { 10 11 S t r i n g s n=a u t h o r . g e t S n ( ) ; S t r i n g gn=a u t h o r . getGn ( ) ; 12 13 14 System . o u t . p r i n t l n ( ” 15 A u t h o r : ”+a u t h o r ) ; 16 } 17 18 } 7 / 27 JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Java und XML – Analogien XML Document Java Class instance of XML Schema follows Aufgabe Java Object 8 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen JAXB – Konzeptionell XML Schema compile Java Class Java Class XML Document validate unmarshall instance of follows generate Java Object Java Object marshall 9 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema/Klasse – Mapping • Schema-Compiler XML Schema Erstellt aus Java-Klassen entsprechende XML-Schemata • Aber Achtung: generate • Schema-Generator compile Erstellt aus XML-Schemata entsprechende Java-Klassen Java Class Java Class Keine vollständige Abbildung 10 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema-Compiler: Beispiel 1. XML-Schema Library.xsd (Auszug): 1 2 3 4 5 6 <x s : c o m p l e x T y p e name=” A u t h o r ”> <x s : s e q u e n c e> <x s : e l e m e n t name=” s n ” t y p e=” x s : s t r i n g ” /> <x s : e l e m e n t name=” gn ” t y p e=” x s : s t r i n g ” /> </ x s : s e q u e n c e> </ x s : c o m p l e x T y p e> 2. Aufruf des Compilers: $> xjc Library .xsd 3. Ergebnis (generierte Dateien): • • • • Author.java Book.java Library.java ObjectFactory.java 11 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema-Compiler: Ergebnis (vereinfacht) 1 p u b l i c c l a s s Author { 2 pr ote ct ed S t r i n g sn ; p r o t e c t e d S t r i n g gn ; 3 4 5 p u b l i c S t r i n g getSn ( ) { r e t u r n sn ; } 6 7 8 9 public void setSn ( String value ) { t h i s . sn = v a l u e ; } 10 11 12 13 p u b l i c S t r i n g getGn ( ) { r e t u r n gn ; } 14 15 16 17 p u b l i c void setGn ( S t r i n g v a l u e ) { t h i s . gn = v a l u e ; } 18 19 20 21 22 } 12 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema-Compiler: Ergebnis (vereinfacht) 1 p u b l i c c l a s s Book { 2 p r o t e c t e d L i s t <Author> a u t h o r s ; protected String t i t l e ; protected long isbn ; 3 4 5 6 p u b l i c L i s t <Author> g e t A u t h o r s ( ) { i f ( a u t h o r s == n u l l ) { a u t h o r s = new A r r a y L i s t <Author >() ; } return this . authors ; } 7 8 9 10 11 12 13 public String getTitle () { return t i t l e ; } 14 15 16 17 [...] 18 19 20 } 13 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Type Mapping – Übersicht Java Type boolean byte short int long float double XML Type xs:boolean xs:byte xs:short xs:int xs:long xs:float xs:double Java Class java.lang.String java.math.BigInteger java.math.BigDecimal java.util.Calendar java.util.Date java.lang.Object java.util.UUID XML Type xs:string xs:integer xs:decimal xs:dateTime xs:dateTime xs:anyType xs:string 14 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema-Generator: Beispiel 1. Java-Klassen (Sammlung): 1 p u b l i c c l a s s Author { 2 p r i v a t e S t r i n g sn ; p r i v a t e S t r i n g gn ; 3 4 5 // some g e t t e r s and s e t t e r s [...] 6 7 8 ... } 2. Aufruf des Generators: $> schemagen Library.java 3. Ergebnis (generierte Datei): • schema1.xsd 15 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Type Mapping –Annotationen • Etwa 30 Annotationen steuern das Mapping (Auszug): • • • • • • • • • XmlSchema XmlRootElement XmlElement XmlElementWrapper XmlAttribute XmlValue XmlType XmlJavaTypeAdapter ... 16 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Schema-Generator: Beispiel • Library.java (Auszug): 1 2 @XmlRootElement ( name = ” L i b r a r y ” ) public class Library { • Book.java (Auszug): 1 2 3 4 @XmlAttribute ( r e q u i r e d = true ) protected String t i t l e ; @XmlAttribute ( r e q u i r e d = true ) protected long isbn ; • Author.java (Auszug): 1 2 3 4 @XmlElement ( r e q u i r e d = t r u e ) pr ote ct ed S t r i n g sn ; @XmlElement ( r e q u i r e d = t r u e ) p r o t e c t e d S t r i n g gn ; 17 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Dokument/Objekt – Binding XML Document • Unmarshalling Erstellt aus XML-Dokumenten entsprechende Java-Objekte marshall Erstellt aus Java-Objekten entsprechende XML-Dokumente unmarshall • Marshalling Java Object Java Object 18 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen JAXB – Übersicht Klassen • JAXBContext: Einstiegspunkt in der Anwendung • Unmarshaller: Deserialisiert von XML nach Java • Marshaller: Serialisiert Java-Objekte zu XML-Dokumenten 19 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Marshalling: Beispiel 1. Code in der Anwendung: 1 2 L i b r a r y l i b =new L i b r a r y ( ) ; Book b=new Book ( ) ; 3 4 5 6 7 b. b. b. b. se tTit le (” Enterprise Integration Patterns ”) ; s e t I s b n ( ” 0321200683 ” ) ; g e t A u t h o r s ( ) . add ( new A u t h o r ( ” G r e g o r ” , ” Hohpe ” ) ) ; g e t A u t h o r s ( ) . add ( new A u t h o r ( ” Booby ” , ” Woolf ” ) ) ; 8 9 l i b . g e t B o o k s ( ) . add ( b ) ; 2. Aufruf des Marshallers: 1 2 JAXBContext c=JAXBContext . n e w I n s t a n c e ( L i b r a r y . c l a s s ) ; M a r s h a l l e r m=c . c r e a t e M a r s h a l l e r ( ) ; 3 4 m. m a r s h a l l ( l i b , ” L i b r a r y . xml ” ) ; 3. Ergebnis (generierte Datei): • Library.xml 20 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Unmarshalling: Beispiel 1. XML-Dokument Library.xml (Auszug): 1 2 3 4 5 6 <L i b r a r y> <books> <Book t i t l e =” E n t e r p r i s e I n t e g r a t i o n P a t t e r n s ” i s b n= ” 0321200683 ”> <a u t h o r s> <Author><gn>G r e g o r</ gn><sn>Hohpe</ sn></ Author> <Author><gn>Booby</ gn><sn>Woolf</ sn></ Author> 2. Aufruf des Unmarshallers: 1 2 JAXBContext c=JAXBContext . n e w I n s t a n c e ( L i b r a r y . c l a s s ) ; U n m a r s h a l l e r u=c . c r e a t e U n m a r s h a l l e r ( ) ; 3 4 Library l i b =( L i b r a r y ) u . u n m a r s h a l l ( ” L i b r a r y . xml ” ) ; 3. Ergebnis (Code in der Anwendung): 1 f o r ( Book book : l i b . g e t B o o k s ( ) ) { 2 3 [...] 21 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen JAXB – Validierung • Validierung möglich bei Marshalling und Unmarshalling • Eigentliche Validierung wird von JAXP durchgeführt • Prüfung erst beim Schreiben bzw. Lesen 1 S c h e m a F a c t o r y s f=S c h e m a F a c t o r y . n e w I n s t a n c e ( XMLConstants . W3C SCHEMA NS URI ) ; 2 3 m a r s h a l l e r . setSchma ( s f . newSchema ( ” L i b r a r y . x s d ” ) ) ; 4 5 try { 6 m a r s h a l l e r . m a r s h a l l ( l i b , ” L i b r a r y . xml ” ) ; 7 8 9 } c a t c h ( M a r s h a l l E x c e p t i o n mex ) { 10 mex . p r i n t S t a c k T r a c e ( ) ; 11 12 } 22 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Weiterführende Themen • Einschränkunen beim Mapping zwischem Schemata und Klassen (analog impedance mismatch) • Verhalten bei Änderung der Klassen • Verhalten bei Änderung der Schemata • Weitere: • OR-Mapping mit JAXB (HyperJAXB) • ... 23 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Alternativen – Andere Techniken • SAX • DOM • StAX • XPath • ... 24 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Alternativen – Ähnliche Projekte • Castor: • Java → XML Binding • Java → SQL Persistence • JBind • JiXB • Quick • Zeus 25 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Zusammenfassung 1. JAXB erlaubt uns • aus Klassen entsprechende Schemas zu generieren • aus Schemas entsprechende Klassen zu generieren • aus Objekten entsprechende Dokumente zu generieren • aus Dokumenten entsprechende Objekte zu generieren • Java-Objekte gegen ein XML-Schema zu validieren 2. JAXB unterscheidet sich durch • die direkte Verwendung des Datenmodells 3. JAXB kann verwendet werden • wenn eine Java-Anwendung mit XML umgehen muss 26 / 27 Aufgabe JAXB JAXB-Statik JAXB-Dynamik Schlussbemerkungen Danke für die Aufmerksamkeit. Haben Sie Fragen? 27 / 27