JAXB 2.0 - Buecher.de

Werbung
JAXB 2.0
Samuel Michaelis, Wolfgang Schmiesing
Ein Programmiertutorial für die Java Architecture for XML
Binding
ISBN 3-446-40753-7
Leseprobe
Weitere Informationen oder Bestellungen unter
http://www.hanser.de/3-446-40753-7 sowie im Buchhandel
1
1 JAXB im Überblick
Im folgenden Kapitel werden wir die Java Architecture for XML Binding 2.0 aus der Vogelperspektive betrachten. Hier gilt es, die wesentlichen Teile der JAXB-Spezifikation anschaulich und im Überblick darzustellen. Insbesondere werden wir hier die Begriffe prägen, mit denen wir die Komponenten der JAXB im weiteren Verlauf des Buches und der
Tutorials referenzieren werden. Wir werden darauf eingehen, welche Ziele mit der JAXBSpezifikation 2.0 insgesamt angestrebt wurden.
Um die Hintergründe der JAXB zu verstehen, darf ein Blick auf die Entstehung der JAXBSpezifikation nicht fehlen. Mit diesem Grundverständnis über den Aufbau und das Zusammenspiel der einzelnen Architekturkomponenten gerüstet, wird es uns leichter fallen,
die später im Programmiertutorial vorgestellten Funktionen zu verstehen. Für Anwender,
die bereits mit der Version 1.0 der JAXB gearbeitet haben, werden wir abschließend die
Unterschiede und Neuerungen in der Version 2.0 vorstellen.
1.1
Ziele
Eine High-Level-XML-API bieten
Die Java Architecture for XML Binding ermöglicht dem Applikationsentwickler, seine Java-Anwendung optimal mit XML interagieren zu lassen. JAXB hat dabei den Anspruch,
eine API auf weit abstrakterer Ebene zu bieten, als das bisher mit parser-basierten Ansätzen wie SAX und DOM möglich war. Auch Entwickler, die nicht mit diesen Parsern vertraut sind, sollen die Möglichkeit haben, XML in ihre Anwendungen zu integrieren.
Die JAXB-Spezifikation bemüht sich daher um eine möglichst einfache, für JavaEntwickler intuitiv nutzbare Schnittstelle für den Zugriff auf XML-Daten. Doch was eignet
sich als intuitive Schnittstelle? Java Beans sind wohl eines der Konzepte, die jedem JavaEntwickler vertraut sind. Daher liegt es nahe, Bindungsinformation und Daten durch Klassen im Java Beans-Stil zu repräsentieren. Und genau das ist das primäre Ziel der JAXB,
die Bindung von XML an Java über portable Java Beans, im Fachjargon auch Pojos, kurz
1
1 JAXB im Überblick
für plain old Java objects, genannt. Auf diese Weise können wir bequem über die vertrauten Java-Programmiermethoden mit schemabasierten XML-Daten arbeiten.
Die konsequente Einführung des Pojo-Konzepts in die JAXB-Spezifkation und die einfache Konfiguration dieser Objekte mit Annotationen vereinfachen die Erstellung dieses
Typs von Datenbindung ungemein.
Java 5-Spracherweiterungen nutzen
Um diese Bindung bei Bedarf individuell anzupassen, enthält JAXB Konfigurationsmechanismen, welche die Struktur der erzeugten Klassen bzw. des erzeugten Schemas beeinflussen können.
Dafür werden u.a. Java-Annotationen verwendet, die eine der Erweiterungen darstellen,
die mit der Java Standard Edition 5 eingeführt wurden. Die JAXB-Spezifikation macht
aber auch regen Gebrauch von den weiteren Neuerungen der JSE 5 wie den typsicheren
Enumerationen und den sogenannten Generics. Diese Spracherweiterungen machen die
generierten Klassen und XML-Schemas einfacher und vor allem auch deren Verwendung
sicherer (insbesondere typsicherer).
Die Struktur der erzeugten Klassen und XML-Schemas wird durch Standardkonfigurationen der JAXB und benutzerdefinierte Konfigurationen fest vorgegeben. Oft ist es aber
auch nötig, die generierten Klassen um benutzerdefinierten Code zu erweitern. Auch hierfür müssen Mechanismen definiert werden, um die generierten Klassen so flexibel wie
möglich zu machen.
XML-Schema vollständig unterstützen
Um die JAXB in realen Anwendungen einsetzbar zu machen, ist außerdem eine vollständige Unterstützung der W3C XML-Schemasprache ein weiteres primäres Ziel der JAXB
2.0. Denn nur durch eine vollständige Unterstützung von XML-Schema wird sich JAXB
als Standard durchsetzen können.
Bidirektionale Bindung unterstützen
Ein weiteres wichtiges Ziel der Spezifikation ist die Unterstützung einer bidirektionalen
Datenbindung, d.h., sowohl die Generierung von Java Beans aus einem bestehenden
Schema als auch der umgekehrte Weg, die Generierung eines Schemas aus einem bestehenden Java Beans-Datenmodell, soll durch die JAXB 2.0 unterstützt werden.
Dabei soll auch ein Round Trip möglich sein. Das bedeutet, dass für den Weg Java–XML–
Java, also eine Generierung eines Schemas aus einem Java-Datenmodell und die erneute
Ableitung eines Datenmodells aus diesem Schema, Eingabe und Ausgabe äquivalent sind.
Unterstützung von Webservices
Die Generierung eines Java-Datenmodells aus einem XML-Schema, um eine Anwendung
mit XML-Dokumenten interagieren zu lassen, ist sicherlich vielen ein Begriff. Aber auch
2
1.1 Ziele
der umgekehrte Weg gewinnt im Zeitalter der Webservices mehr an Bedeutung. Wird eine
Anwendung beispielsweise als Webservice veröffentlicht, so wird das existierende Datenmodell der Anwendung durch ein WSDL-Dokument beschrieben. Dies kann durch JAXB
2.0 automatisiert werden, indem aus dem existierenden Datenmodell ein XML-Schema
generiert wird, das dann bei der Kommunikation über XML und SOAP verwendet wird.
In diesem Zusammenhang sollten wir nicht verschweigen, dass die JAXB 2.0Spezifikation die Grundlage für die Bindung von WSDL an Java-Datentypen in der Java
API für XML Web Services (JAX-WS 2.0) bildet. Damit soll JAXB zum Standard für Datenbindungen bei Java-basierten Webservices werden.
Validierung jederzeit ermöglichen
Auch die Validierung von XML-Dokumenten ist eins der Themen, die durch JAXB adressiert werden sollen. Sowohl beim Unmarshalling, also der Transformation von XMLInhalten in Java-Objekte, als auch beim Marshalling, der Transformation von JavaObjekten in XML-Dokumentstrukturen, kann eine Validierung anhand eines XMLSchemas durchgeführt werden. Die Validierung soll dabei so gestaltet sein, dass flexibel
auf ungültige Inhalte reagiert werden kann. Um das Rad nicht neu zu erfinden, wird bei der
Validierung auf bereits bestehende Technologie anderer Java-Spezifikationen zurückgegriffen.
Schemaevolution unterstützen
Ein großes Problem bei der Entwicklung von Datenbindungen an XML-Schema ist die
Weiterentwicklung des XML-Schemastandards. Ein Ziel der JAXB ist daher die Unterstützung des Umgangs mit dieser sog. Schemaevolution.
Portabilität zwischen JAXB-Implementierungen
Um die JAXB als einen De-facto-Standard für XML-Datenbindungen zu etablieren, soll
die Spezifikation in die kommende Java-Version 6.0, Codename „Mustang“, einfließen.
Daher muss die Portabilität der generierten Klassen auf Quellcode- und Binärcode-Ebene
sichergestellt werden. Portabilität bedeutet hier, dass die generierten Klassen einer bestimmten JAXB-Implementierung von jeder anderen Implementierung genutzt werden
können.
Portabilität des Quellcodes bedeutet, dass durch JAXB erstellter Quellcode von allen
JAXB-Implementierungen verstanden wird. Der erstellte Quellcode darf außerdem keine
Abhängigkeiten zu einer bestimmten Implementierung besitzen. Die Portabilität des Binärcodes macht eine erneute Kompilierung dieses Quellcodes bei einem Wechsel der Implementierung überflüssig.
Dieser Ansatz unterscheidet sich von bisherigen Frameworks, die sich des Mittels des Bytecode Enhancements bedienen, um eine einfache Javabean nach dem Kompilieren um
Framework-spezifische Funktionalitäten zu erweitern. Solchermaßen erweiterter Bytecode
ist dann nicht mehr portierbar.
3
1 JAXB im Überblick
1.2
Entstehung
Spezifizierung durch JSR 222
JAXB ist aus dem Java Community Process 1 , kurz JCP, hervorgegangen. Im JCP entwickeln Expertengruppen Spezifikationen im Bereich der Java-Entwicklung. Diese Spezifikationen werden als Java Specification Requests (JSR) betrieben und veröffentlicht. Einige
bekannte JSRs sind etwa die Java 5 Generics aus JSR 14 oder typsichere Enumerationen in
JSR 201.
Auch für die JAXB gibt es eine Expertengruppe, deren Hauptaufgabe natürlich die Weiterentwicklung der JAXB-Spezifikation ist. Neben dieser Spezifikation in Papierform besteht
ein JSR in der Regel noch aus einer Codebasis, nämlich einer Referenzimplementierung
(RI) und einem Technology Compatibility Toolkit (TCK).
Die Referenzimplementierung dient dazu, den aktuellen Stand der Spezifikation als Implementierung widerzuspiegeln und zu validieren. Weitere solcher Implementierungen der
Spezifikation durch andere Anbieter sind natürlich möglich, sogar erwünscht. So wird mit
JAX-Me2 2 eine alternative Implementierung der JAXB von der Apache Group 3 betrieben.
Das TCK stellt die Kompatibilität einer JAXB-Implementierung zum JAXB-Standard sicher. Es besteht aus einer Reihe von Tests, die eine JAXB-Implementierung erfolgreich
durchlaufen muss, um sich für den JAXB Standard zu zertifizieren.
Entwicklung durch das JAXB Project
Die Entwicklung und Verwaltung der Referenzimplementierung wird durch das JAXB Project betrieben. Das JAXB Project wurde bei Sun als Open-Source-Projekt veröffentlicht.
Diese Entwicklergruppe realisiert neben der oben beschriebenen Referenzimplementierung
und dem TCK noch weitere Tools zur Unterstützung rund um JAXB. Das JAXB Project ist
wiederum Teil des Projekts Glassfish, das eine Referenzimplementierung der neuen Java
Enterprise Edition 5 darstellt.Veröffentlichung
Erstmals veröffentlicht wurde JAXB in der Version 1.0 durch den JSR 31. Seit dieser Version ist JAXB auch Bestandteil des Java Web Service Developer Packages (Java WSDP,
aktuell in der Version 2.0). In diesem Buch werden wir uns ausschließlich der neuen JAXB
in der Version 2.0 widmen, die einige bedeutende Neuerungen umfasst und damit einen
großen Schritt in Richtung Projekttauglichkeit macht.
Die JAXB 2.0 wurde im April 2006 als Final Release des JSR 222 verabschiedet. Getragen
wird die Spezifikation dabei hauptsächlich von Sun Microsystems. Die Expertengruppe
4
1
http://www.jcp.org
2
http://ws.apache.org/jaxme
3
http://www.apache.org
4
https://jaxb.dev.java.net
1.3 Architektur
wird jedoch noch von vielen weiteren Industriegrößen wie BEA, Oracle und SAP unterstützt. Ziel dabei ist, die JAXB-Spezifikation in Zukunft in die Java Standard Edition zu
integrieren. Damit wäre JAXB die Standardlösung für Java-XML-Datenbindungen.
Doch genug der Geschichte, es ist an der Zeit, einen Blick auf die Architektur von JAXB
zu werfen.
1.3
Architektur
Als erster Überblick sind hier die einzelnen Komponenten der JAXB-Architektur gelistet.
In den folgenden Abschnitten werden wir die genannten Komponenten dann etwas näher
beschreiben.
Architekturkomponenten
„
Annotationen: Die JAXB ist ein annotationsgetriebenes Framework (annotation
driven). Annotationen werden dazu verwendet, die Abbildung von Java- auf XMLRepräsentation zu konfigurieren.
„
Schema-Compiler: Der Schema-Compiler bindet ein existierendes Schema an ein generiertes Java-Datenmodell. Diese Erzeugung einer Java-Repräsentation aus einem
XML-Schemadokument ist ein häufig verwendeter Weg, die Java- und XML-Welten
zu verbinden. Er eignet sich besonders für dokumentgetriebene Anwendungsszenarien.
„
Schema-Generator: Der Schema-Generator bindet ein existierendes Java-Datenmodell
an ein generiertes XML-Schema. Die Information für die Abbildung der JavaElemente auf ein XML-Schema definiert der Entwickler durch Annotationen im existierenden Datenmodell. Dieser Weg eignet sich am besten für modellgetriebene Anwendungsszenarien.
„
Binding Framework: Das Binding Framework stellt die Schnittstelle zur Anwendung
dar. Es bietet eine Reihe von API-Klassen und -Funktionen, die zur Laufzeit aufgerufen werden: Die wichtigsten Funktionen sind das Marshalling und Unmarshalling. Das
Unmarshalling realisiert die Transformation von XML zu Java. Das Marshalling hingegen überführt Java-Objekte in XML-Dokumentinstanzen. Begleitend zu diesen Operationen kann automatisch eine Validierung der XML-Inhalte anhand eines XMLSchemas erfolgen. Mit dem Binder schließlich kann eine transparente Bearbeitung eines XML-Dokuments über ein gebundenes Java-Datenmodell erfolgen – Marshalling
und Unmarshalling finden hier im Hintergrund statt.
5
1 JAXB im Überblick
Compile-Zeit- vs. Laufzeitkomponenten
Grundsätzlich können wir die Architekturkomponenten in zwei Bereiche aufteilen:
„
Komponenten der Compile-Zeit: Schema-Compiler und Schema-Generator werden zusammen mit den Annotationen zur Compile-Zeit, d.h. vor Ausführung der Anwendung,
benötigt. Sie stellen die Bindung durch Generieren eines Java-Datenmodells bzw. eines
Schemas her.
„
Komponenten der Laufzeit: Das Binding Framework wird zur Laufzeit von der Anwendung selbst benutzt, um XML-Inhalte zu verarbeiten.
Das Zusammenspiel dieser Komponenten zeigt die folgende Architekturübersicht.
XML-Schema
Schema Generator
Schema Compiler
Bindungsdeklarationen
Portable Java Beans
JAXB-Annotationen
JAXB Annotationen
Compile-Zeitkomponenten
Laufzeitkomponenten
<f:foo ...
<element ...
</element>
</f:foo>
Unmarshalling
Marshalling
Binding-Framework
JAXB API
Unmarshalling
Marshalling
Validierung
XML-Dokument
Abbildung 1.1 Komponenten der JAXB-Architektur
6
Java Beans-Instanzen
Herunterladen