jaxb:bindings

Werbung
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB
<< Java Architecture for
XML Binding >>
1
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB
Lernziele
• Übersicht JAXB
• Prinzip von Data Binding verstehen
• Java Klassen aus XSD erzeugen
• Java Objekte aus XML marschallen
bzw. unmarschallen
• Customized Binding
2
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB
Was ist JAXB ?
JAXB = Java Architecture for XML Binding
JAXB ist ein Standard von SUN bezüglich Java
Objekte und XML. (java.sun.com/xml/jaxb)
JAXB enstand aus dem Java Community
Process JSR 31 (ca. 2001)
3
MacroMedia
BEA
HP
BreezeFactor
Fujitsu
webMethods
IBM
Intalio
Oracle
Software AG
TIBCO Extensibility
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB
Eigenschaften von JAXB
Bei JAXB werden die Klassen nicht mehr in
Java geschrieben. Sie werden entweder mittels
XML Schema oder einer DTD beschrieben.
Ein Binding Compiler generiert den Java Source
Code anhand von XML Schema oder DTD.
JAXB bietet ein Framework um Instanzen
dieser generierten Klassen in XML zu
marschallen und wieder zurück.
4
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Prinzip
Prinzip Data Binding bei JAXB
Data
Data
Structures
Structures
<xsd>
<xsd>
<!<!DTD
DTD>>
Binding
Compiler
Customized
Customized
Binding
Binding
<xml>
<xml>
<xml>
<xml>
Java
Java
Source
Source
Code
Code
Java
Compiler
Java
Java
Byte
Byte
Code
Code
Binding
Framework
JAXB erzeugt anhand XSD Java Source Code.
Diese Klassen haben die Binding Funktionen
schon eingebettet.
5
Objekte
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Prinzip
Prinzip Data Binding bei JAXB
6
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Prinzip
Zusammenspiel von Schema und Objekten b. JAXB
7
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Prinzip
Warum Klassen durch XSD oder DTD generieren?
Mittels XSD lässt sich fast jede beliebige
Datenstruktur beschreiben
Das Prinzip lässt sich auch auf andere Technologien anwenden und mit Java kombinieren.
z.B. Generierung des Datenmodel einer Datenbank
DB
Data
Data
Model
Model
[SQL]
[SQL]
8
Binding
Framework
Data
Data
Structures
Structures
<xsd>
<xsd>
Objekte
Java
Java
ByteCode
ByteCode
[class]
[class]
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Installation
JAXB beziehen und installieren:
JAXB kann bei SUN bezogen werden. Es wird nur
zusammen mit dem Java Webservice Development
Pack JWSDP ausgeliefert.
java.sun.com/webservices/jwsdp/index.jsp
Zurzeit ist das JWSDP ein Package mit eigenem
Installer
JAXB Konfiguration:
Um das JWSDP bzw. JAXB zu nutzen müssen die
Home Environment Variablen angelegt werden.
set JAVA_HOME=<your J2SE installation directory>
9
set JWSDP_HOME=<your JWSDP 1.4 installation directory>
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Binding
Beispiel einfache Klassen „CD Catalog“:
public class Catalog
{
Collection cds;
}
public class Cd
{
String title;
Sting artist;
double price;
String country;
}
Cd
Catalog
cds
0..*
title
artist
price
country
Set() und Get() Methoden für wurden wegen die
wegen der Übersichtlichkeit weggelassen
10
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Binding
Beispiel einfache Klassen „CD Catalog“ in DTD:
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
catalaog (cd*) >
cd (title, artist, price) >
cd country CDATA #REQUIRED>
title (#PCDATA) >
artist (#PCDATA) >
price (#PCDATA) >
Die DTD lässt eine sehr kompakte Schreibweise zu
Mittels der DTD können wir Relationen (0..*) oder
(1..*) genauer ausdrücken als in Java.
11
Datentype der Klassenattribute sind aber
beschränkt, alles wird zu String
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Binding
Beispiel einfache Klassen „CD Catalog“ in XSD:
12
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="catalog">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cd" type="Cd"
maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Cd">
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="artist" type="xsd:string"/>
<xsd:element name="price" type="xsd:double"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Binding
Vorteile Beschreibung mittels XSD:
Bei XSD ist der Syntax nicht so kompakt
Mittels XSD können genauere Relationen definiert
werden als mit DTD oder Java
XSD lässt genauere Datentypen zu als DTD
13
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Binding Compiler
Verwendung des Bindings Compilers:
Der Binding Compiler kann entweder mittels ANT
oder über das mitgelieferte „xjc.bat“ aufgerufen
werden
Beispiel Aufruf „xjc.bat“:
%JWSDP_HOME%\jaxb\bin\xjc.bat -p my.music –d gen-src cdcatalog.xsd
14
Parameter
Beschreibung
-p pack.subpack
package für die generierten Klassen
-d dir
Destinations-Verzeichnis, muss existieren
xxxx.xsd
Pfad zur XML Schema Datei
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Binding Compiler
Verwendung des Bindings Compilers:
Beispiel Ausgabe:
%JWSDP_HOME%\jaxb\bin\xjc.bat -d gen-src -p my.music cdcatalog.xsd
parsing a schema...
compiling a schema...
my\music\impl\CatalogImpl.java
my\music\impl\CatalogTypeImpl.java
my\music\impl\CdImpl.java
my\music\impl\JAXBVersion.java
my\music\Catalog.java
my\music\CatalogType.java
my\music\Cd.java
my\music\ObjectFactory.java
my\music\bgm.ser
15
my\music\jaxb.properties
ca. 40 Dateien
werden generiert !
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Binding
Ausgabe des Binding Compilers:
JAXB generiert für unsere Objekte jeweils
Interfaces, Implementation und Hilfsklassen
Wir werden nie direkt die Implementation selber
verwenden, sondern nur die Interfaces und
Hilfsklassen
Catalog
CatalogImpl
16
Cd
CdImpl
ObjectFactory
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Framework
Marshalling mit JAXB
// create Factory
ObjectFactory factory = new ObjectFactory();
// Build Cd Catalog
Catalog cat = factory.createCatalog();
Cd cd = factory.createCd();
cd.setCountry("USA");
cd.setPrice(10.90);
...
cat.getCd().add(cd);
// initialise JAXB
JAXBContext jc = JAXBContext.newInstance("my.music");
// create a Marshaller
Marshaller m = jc.createMarshaller();
// marshal catalog
OutputStream os = new FileOutputStream("cdcatalog.xml");
17
m.marshal( cat, os );
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Framework
Unmarshalling mit JAXB
// initialise JAXB
JAXBContext jc = JAXBContext.newInstance("my.music");
// create an Unmarshaller
Unmarshaller u = jc.createUnmarshaller();
// unmarshal catalog
Catalog cat = (Catalog) u.unmarshal(
new FileInputStream("cdcatalog.xml"));
// Iterate through CD's
Iterator it = cat.getCd().iterator();
while(it.hasNext()) {
Cd cd = (Cd) it.next();
System.out.println(cd.getTitle());
}
18
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Framework
Validierung bei Marshalling (1/2):
Der Marshaller von JAXB unternimmt keine
Validierung beim marshallen der Objekte. Dies
kann zu einer Verletzung des Schemas führen
Beispiel im XSD:
<xsd:element name="cd" type="Cd"
maxOccurs="unbounded" minOccurs="2"/>
Beispiel im Java Code:
// Build Cd Catalog with only one CD
Catalog cat = factory.createCatalog();
cat.getCd().add(cd);
m.marshal( cat, os );
Auswirkungen wären ungültige XML
19
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Framework
Validierung bei Marshalling (2/2):
JAXB bietet einen Validator um die Objektstruktur
gemäss dem Schema zu überprüfen
Beispiel im Java Code:
// Build Cd Catalog with only one CD
Catalog cat = factory.createCatalog();
cat.getCd().add(cd);
// Create Validator
Validator validator = jc.createValidator();
validator.validate(cat);
m.marshal( cat, os );
Ausgabe ist eine Exception da mehr CD‘s erwartet wurden:
DefaultValidationEventHandler: [ERROR]:
uncompleted content model. expecting: <cd>
20
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
JAXB bietet die Möglichkeit das Binding nach
eigenen Wünschen anzupassen.
• Abbildung von XML Elementen Æ Java Bean
• Package
• Vererbung
• Methodennamen
• Datentypen für Java Bean Attribute
Das „Customized Binding“ wird mittels definierten
XML Anweisungen beschrieben.
Diese Anweisungen können „inline“ im XSD oder
als externe Datei realisiert werden.
21
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Beispiel einer externen Binding Definition (1/2):
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<jaxb:bindings schemaLocation="cdcatalog.xsd">
<jaxb:bindings node="//xs:complexType[@name='Cd']">
<jaxb:class name="CompactDisc"/>
<jaxb:bindings node="//xs:element[@name='title']">
<jaxb:property name="AlbumName"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Hier wird ein XML Element auf eine anderen
Klassennamen gemappt
22
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Beispiel einer externen Binding Definition (2/2):
Generiertes Interfaces nach Aufruf des Binding Compilers
interface CompactDisc
{
public void setAlbumName(String value);
public String getAlbumName();
public void setPrice(double value);
public double getPrice();
public void setArtist(String value);
public String getArtist();
}
23
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Die wichtigsten Customizing Binding Instruktionen
sind:
<jaxb:bindings>
Root Element oder Beginn einer Definition
<jaxb:class>
Mapping von einem XSD ComplexType auf Klasse
<jaxp:property>
Mapping von einem Element oder Attribut auf ein
Bean Property
<jaxb:javaType>
Angaben um spezielle Datentypen von/nach String zu
konvertieren
24
XML mit
Java OpenSource
(c) Mark Egloff 2004
Deklaration
JAXB – Customized Binding
Aufbau eines externen Bindings (1/3):
Root
schemaLocation
bindings node
class
<jaxb:bindings ... >
<jaxb:bindings
schemaLocation ... >
<jaxb:bindings
node="[xpath]">
property
<jaxb:xxxx>
javaType
</jaxb:bindings>
bindings node
<jaxb:bindings
node="[xpath]"/>
</jaxb:bindings>
schemaLocation
25
<jaxb:bindings
schemaLocation ... />
</jaxb:bindings>
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Aufbau eines externen Bindings (2/3):
Externe Binding Defintionen beginnen mit dem
Root „<jaxb:bindings>“. Der Namespace und die
Version ist dabei zwingend
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">
Danach wird auf das jeweilige Schema mit einem
„<jaxb:bindings schemaLocation>“ verwiesen
26
<jaxb:bindings xmlns:jaxb=... >
<jaxb:bindings schemaLocation="path.to.Schema.xsd">
...
</jaxb:bindings>
</jaxb:bindings>
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Aufbau eines externen Bindings (3/3):
Die Binding Definition besteht aus verschiedenen
„Mapping“ Instruktionen. Die Beziehung zwischen
diesen Instruktionen und dem XSD wird mittels
XPath festgelegt.
<jaxb:bindings xmlns:jaxb=... >
<jaxb:bindings schemaLocation="...">
27
<jaxb:bindings node="//xsd:complexType[@name='Cd']">
<jaxb:class name="CompactDisc"/>
<jaxb:bindings node="//xsd:element[@name='title']">
<jaxb:property name="AlbumName"/>
</jaxb:bindings>
</jaxb:bindings>
...
</jaxb:bindings>
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Aufruf des Binding Compilers bei externem Binding:
Die externe Binding Definition wird beim Aufruf
des Binding Compilers mit einem separaten
Parameter „-b“ angegeben:
%JWSDP_HOME%\jaxb\bin\xjc.bat -b cdcatalog.jbx cdcatalog.xsd
28
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Beispiel einer „inline“ Binding Definition (1/2):
<xsd:complexType name="Cd">
<xsd:attribute name="country" type="xs:string">
<xsd:annotation>
<xsd:appinfo>
<jaxb:property name="ISOCountry"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
Die Binding Instruktionen werden mittels
„<xsd:annotation>“ in das Schema eingebettet
29
Sie werden jeweils für jedes Element separat
angegeben
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB – Customized Binding
Beispiel einer „inline“ Binding Definition (2/2):
<xs:complexType name="Cd">
<xs:attribute name="country" type="xs:string">
<xs:annotation>
<xs:appinfo>
<jaxb:property name="ISOCountry"/>
</xs:appinfo>
</xs:annotation>
public interface Cd
</xs:attribute>
{
</xs:complexType>
public void setISOCountry(String c);
public String getISOCountry();
}
30
Hier wird ein XML Attribut auf ein bestimmtes Java
Bean Property gemappt
XML mit
Java OpenSource
(c) Mark Egloff 2004
JAXB - Links
z
Sun: JAXB
http://java.sun.com/xml/jaxb/
z
Sun: Java Web Service Tutorial
http://java.sun.com/webservices/docs/1.4/tutorial/doc/
z
xml.com: The JAXB API
http://www.xml.com/pub/a/2003/01/08/jaxb-api.html
z
On Java: Understanding JAXB
http://www.onjava.com/pub/a/onjava/2003/12/10/jaxb.html
z
IBM: Data Binding with JAXB
http://www-106.ibm.com/developerworks/edu/x-dw-xjaxb-i.html
31
Herunterladen