Java API for XML Binding

Werbung
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
Herunterladen