1 / 138

JAXB (Java API for XML Data Binding)

JAXB (Java API for XML Data Binding). Cheng-Chia Chen. Agenda. What is and Why JAXB? How to use JAXB? JAXB architecture Binding process Custom binding Runtime operations JAXB Roadmap. Languages for XML Schemas. XML 1.0 Document Type Definitions (DTDs) Fairly weak constraints

Télécharger la présentation

JAXB (Java API for XML Data Binding)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. JAXB(Java API for XML Data Binding) Cheng-Chia Chen

  2. Agenda • What is and Why JAXB? • How to use JAXB? • JAXB architecture • Binding process • Custom binding • Runtime operations • JAXB Roadmap

  3. Languages for XML Schemas • XML 1.0 Document Type Definitions (DTDs) • Fairly weak constraints • No data types or complex structural relationships • W3C XML Schema Definition Language Recommendation (2, May, 01) • Many Others • RELAXNG,…

  4. <!--document instance--> • <?xml version="1.0"?> • <trade action="buy"> • <symbol>ABC</symbol> • <quantity>30</quantity> • </trade> W3C XML Schema Definition for Sample Document Instance <xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="tradeType"> <xsd:sequence> <xsd:element name = "symbol"type = "xsd:string"/> <xsd:element name = "quantity"type = "xsd:int"/> </xsd:sequence> <xsd:attribute name = "action" use = "required"> <xsd:simpleType> <xsd:restriction base = "xsd:NMTOKEN"> <xsd:enumeration value = "buy"/> <xsd:enumeration value = "sell"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:complexType> <xsd:element name = "trade"type="tradeType"/> </xsd:schema>

  5. XML Processing Options • SAX • (push sax) Stateless event driven • Pull SAX • StAX (JSR-173 in JCP public review): Streaming API for XML • XML Pull parsing • DOM (language neutral) • Memory intensive parse tree • XOM, JDOM, DOM4J • DOM-like APIs for Java • JAXB , Castor, XMLBeans • XML to Java objects binding • document  object and schema  class • digester • rule-based XML processing • Jelly, ant • Executable XML • RelaxNGCC • syntax-directed approach

  6. What is & WhyJAXB?

  7. instanceOf instanceOf What Is JAXB? • A system providing API, tools, and a framework that automate the mapping between XML documents and Java objects

  8. Things You can do during Runtime • Unmarshal XML content (XML document instance) to Java representations • XML documents  Java Objects • Access, update and validate the Java representation against schema constraints • create/manipulat java objects • Marshal the Java representation of the XML content into XML content • java objects  XML documents • advantage: • Use domain object model instead of DOM/XML model to manipulate data.

  9. Why JAXB? • An efficient and standard way of mapping between XML and Java code • Programmers don't have to create application specific Java objects anymore themselves • Programmers do not have to deal with XML structure, instead deal with meaning business data • getPerson() method as opposed to getAttributes() • In a sense JAXB is high-level language while JAXP/SAX/DOM are assembly language for XML document management

  10. Why JAXB? • Issues with DOM/SAX model • Why do I have to walk a Parse Tree containing much more than just application data? • getNodeName(), getNodeType(), getNodeValue() • Why do I have to write Event Handlers to map XML content to Java™ classes? • Value proposition of JAXB • JAXB automates XML to Java™ binding so you can easily access your data

  11. JAXB versus DOM • Both JAXB and DOM create in-memory content tree • In JAXB, • Content tree is specific to a specific source schema • Does not contain extra tree-manipulation functionality • Allows access to its data with the derived classes' accessor methods • “Data-driven” as opposed to “XML document driven” • Content tree is not created dynamically, thus uses memory efficiently

  12. JAXB Design Goals • Easy to use • Lower “barrier to entry” to manipulating XML documents within Java programs • Don't have to deal with complexities of SAX and DOM • Customizable • Sophisticated applications sometimes require fine control over the structure and content of schema-derived classes • Allows keeping pace with schema evolution

  13. JAXB Design Goals • Portable • JAXB components can be replaced without having to make significant changes to the rest of the source code • Validation on demand • Validate the tree against the constraints in the source schema • Clean “round-tripping” • Converting a Java content tree to XML content and back to Java content again should result in equivalent Java content trees before and after the conversion

  14. How to Use JAXB?

  15. Steps of Building & Using JAXB Applications (Compile time) • Develop or obtain XML schema/DTD • Optionally annotate the schema with binding customizations if necessary (or place them in an external binding file) • Generate the Java source files • By compiling the XML Schema through the binding compiler • Develop JAXB client application • Using the Java content classes generated by the binding compiler along with the javax.xml.bind JAXB interfaces • Compile the Java source codes • client application + • API code generated by jaxb compiler.

  16. Steps of Building & Using JAXB Applications (Runtime) • With the classes and the binding framework, write Java applications that: • Build object trees representing XML data • that is valid against the XML Schema by either unmarshalling the data from an XML document or instantiating the classes you created • Access and modify the data • Optionally validate the modifications to the data relative to the constraints expressed in the XML Schema • Marshal in-memory data to a new XML document

  17. Schema Languages that JAXB Supports • JAXB RI 1.0.4 • (compliant with JAXB spec 1.0) from Java WSDP 1.5 • Support XML Schema, DTD and RELAX NG.

  18. JAXB Architecture

  19. JAXB Architecture source: JAXB User's Guide

  20. XML Data Binding Facility • Binding compiler (xjc) • Binds schema components to derived classes • Schema derived interfaces and classes • A content tree is a tree of in-memory instances • The methods provide access to the content of the corresponding schema component • Binding Runtime API • Provide runtime XML-enabling operations (unmarshalling, marshalling, validating) on content trees through schema-derived classes • Implementation of javax.xml.bind

  21. Binding runtime API (in package javax.xml.binding • The basic binding operations provided are: • UnmarshalXML document to a content tree • Validate a content tree based on constraints expressed within the original schema • Marshal a content tree to an XML document

  22. Binding Process

  23. Binding Process: 2 Phases • Design time • Generate JAXB classes from a source schema • Compile the JAXB classes • Build an application that uses these classes • Run time (Binding runtime) • Unmarshal XML content tree + create xml content tree fro the generated java classes. • Process (Access & Modify) XML content tree • Validate XML content tree • Marshal XML content tree

  24. Derived Classes Schema Instances of follows Objects XMLDocument The Binding Life Cycle compile validate unmarshal marshal

  25. Binding Process :Design Time Binding Process

  26. package DerivedClass Schema Property Binding Compiler Property Binding Schema (optional) Role of Binding Compiler • principles: • Bind target XML namespace to package • Bindelementorcomplex type to derived class • Bind attribute orleaf element to a property

  27. Binding Rules • Default rules • Specified in the JAXB spec • xjc uses default rules for components of source schema not mentioned explicitly in custom binding declaration • Custom rules (Custom Binding Declaration) • Can be “inline”'ed in XML schema document or • Separate custom binding declaration file

  28. Binding Process:Default Binding

  29. Default XML to Java Binding • Simple Type Definitions • Default Data Type Bindings • Default Binding Rules Summary

  30. Default Data Type Binding Java Data Type XML Schema Type • xsd:string • xsd:integer • xsd:int • xsd:long • xsd:short • xsd:decimal • xsd:float • xsd:double • xsd:boolean • xsd:byte • xsd:QName • java.lang.String • java.math.BigInteger • int • long • short • java.math.BigDecimal • float • double • boolean • byte • javax.xml.namespace.QName

  31. Default Data Type Binding Java Data Type XML Schema Type • xsd:dataTime • xsd:base64Binary • xsd:hexBinary • xsd:unsignedInt • xsd:unsignedShort • xsd:unsignedByte • xsd:time • xsd:date • xsd:anySimpleType • java.util.Calendar • byte[] • byte[] • long • int • short • java.util.Date • java.util.Date • java.lang.String

  32. Binding Process:Default Binding Rules &Examples

  33. To From • global element declaration • Local element declaration that can be inserted into a general content list • Attribute • Java Element interface • Java Element interface • Java property Default Binding Rules:Global Element

  34. Default Binding Example: Global Element JAXB Binding XML Schema • <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> • <xsd:element name="purchaseOrder" type="PurchaseOrderType"/> • <xsd:element name="comment" type="xsd:string"/> • (nothing) • PurchaseOrder.java • Comment.java

  35. PurchaseOrder.java package primer.po;  from target namespace /** * Java content class for purchaseOrder element declaration. * <p>The following schema fragment specifies the expected * content contained within this java content object. * <p> * <pre> * &lt;element name= "purchaseOrder" * type = "{}PurchaseOrderType“ /> * </pre> * */ public interface PurchaseOrder extends javax.xml.bind.Element, primer.po.PurchaseOrderType { }

  36. Default Binding Rules:Named ComplexType From To • XML Namespace URI • (global) Named complexType • Anonymous inlined type definition of an element declaration • A named simple type definition with a basetype that derives from "xsd:NCName" and has enumeration facet • Java package • Java content interface • Java content interface • typesafe enum class

  37. XML Schema JAXB Binding <xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="items" type="Items"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType> PurchaseOrderType.java Default Binding Example: Named ComplexType property name property type

  38. PurchaseOrderType.java package primer.po; public interface PurchaseOrderType { primer.po.Items getItems(); void setItems(primer.po.Items value); java.util.Calendar getOrderDate(); void setOrderDate(java.util.Calendar value); java.lang.String getComment(); void setComment(java.lang.String value); primer.po.USAddress getBillTo(); void setBillTo(primer.po.USAddress value); primer.po.USAddress getShipTo(); void setShipTo(primer.po.USAddress value); } Schema type does not implement Element interface

  39. XML Schema <xsd:complexType name="USAddress"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType> JAXB Binding UMLClass : Default Binding Example: ComplexType name: String street: String city: String state:String zip: BigDecimal country: String = “US” USAddress

  40. USAddress.java package primer.po; public interface USAddress { java.lang.String getState(); void setState(java.lang.String value); java.math.BigDecimal getZip(); void setZip(java.math.BigDecimal value); java.lang.String getCountry(); void setCountry(java.lang.String value); java.lang.String getCity(); void setCity(java.lang.String value); java.lang.String getStreet(); void setStreet(java.lang.String value); java.lang.String getName(); void setName(java.lang.String value);}

  41. Derived Interfaces • Each (global) complex type definition (Named ComplexType) mapped to • a derived interface and • an implementation class • Enable user implementation of derived interface via binding schema • Schema Type definition hierarchy mapped to Java inheritance class/interface hierarchy • Natural mapping of "derivation by extension“ • SchemaTypeB  SchemaTypeB (by extension) • => JavaTypeB extends JavaTypeA • No plans to enforce "derivation by restriction“ • SchemaTypeB  SchemaTypeB (by restriction) • => JavaTypeB = JavaTypeA [+ constraint predicate]

  42. <xs:simpleType name="productCode"> <xs:restriction base="xs:string"> <xs:length value="8" fixed="true"/> </xs:restriction> </xs:simpleType> <element name= “A” type=“productCode” /> The type productCode has { base type = String predicate (constraint) length = 8. } Then • public interface A extends Element { public String getValue() ; // will throws exception if |value| != 8. pulic void setValue(String value) throws Exception; …}

  43. Enumeration  type safe enumeration class • Enumeration Class <xs:simpleType name="USState"> <xs:restriction base="xs:NCName"> <xs:enumeration value="AK"/> <xs:enumeration value="AL"/> </xs:restriction> </xs:simpleType>

  44. The mapped class public class USState { // Constructor protected USSate(String value) { ... } // one enumeration constant for each enumeration value public static final String _AK="AK"; public static final USState AK= new USState(_AK); public static final String _AL="AL"; public static final USState AL= new USState(_AL); // Gets the value for an enumerated value public String getValue(); // Gets enumeration with a specific value // Required to throw java.lang.IllegalArgumentException if // any invalid value is specified public static USState fromValue(String value) {...} // Gets enumeration from a String // Required to throw java.lang.IllegalArgumentException if // any invalid value is specified public static USState fromString(String value){ ... } // Returns String representation of the enumerated value public String toString() { ... } public boolean equals(Object obj) { ... } public int hashCode() { ... } }

  45. Simple List type <xs:simpleType name="xs:USStateList"> <xs:list itemType="xs:string"/> </xs:simpleType> <xs:element name= “A” type=“xs:USStateList”/> => basetype = String collectionType = default to java.uitl.List predicate allows only String to be added . public interface A extends Element { List getValue() ; // List is a list of Strings List setValue(); … }

  46. Union type <xs:complexType name="CTType"> <xs:attribute name="state" type="ZipOrName"/> </xs:complexType> <xs:simpleTypename="ZipOrName" memberTypes="xs:integer xs:string"/> => public interface CTType { Object getState(); void setState(Object value); } Note 1. Object is the least common super type of Integer & String.

  47. Default Binding Rules: Attribute To From • A global element declaration • Local element declaration that can be inserted into a general content list • Attribute • Java Element interface • NestedJava Element interface • Java property

  48. Derived Classes: Properties • Fine-grained XML components bound to a property • Accessed by setter and getter methods similar to JavaBeans™ property accessors • Optional validation checking by setter • Three Core Property types • Simple Bean design pattern • Indexed Bean design pattern • Collection Map to java.util.List types

  49. XML SchemaDerived Class <xsd:complexType name="trade"> <xsd:sequence> <xsd:element name="symbol" type ="xsd:string"/></sequence> <xsd:attribute name="quantity" type ="xsd:int"/> </xsd:complexType> public interfaceTrade{ String getSymbol(); void setSymbol(String); int getQuantity(); void setQuantity(int); } Example: Default XML Binding

  50. Property Basics • Invoking setX(null) discard property's set value • getter method returns • property's set value, if it is set with non-null • schema specified default value, if existed • Java default initial value for property's base type • Additional Property methods • isSetX() returns true if property's value is set • Not generated by default, not all apps need this

More Related