Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/From Schema"

m (Customizing Generated Mappings with EclipseLink Metadata)
m (Replacing page with 'See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm')
 
(45 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{EclipseLink_UserGuide
+
See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm
|info=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
|api=y
+
|apis= * [http://www.eclipse.org/eclipselink/api/2.1/index.html?org/eclipse/persistence/jaxb/JAXBContextFactory.html *.jaxb.JAXBContextFactory]
+
|toc=y
+
}}
+
 
+
=Specifying Bootstrapping from an XML Schema =
+
As with conventional JAXB, the first step is to create a '''JAXBContext'''. This is achieved by use of the '''DynamicJAXBContextFactory''' class. A '''DynamicJAXBContext''' ''cannot'' be instantiated directly; it must be created through the factory API.
+
 
+
A DynamicJAXBContext can be created from:
+
* an XML Schema file (XSD)
+
* the EclipseLink OXM metadata file
+
* an EclipseLink Project specified in the EclipseLink '''sessions.xml''' file
+
 
+
 
+
==Bootstrapping from XML Schema (XSD)==
+
With EclipseLink MOXy, you can provide an existing XML schema from which to create a '''DynamicJAXBContext'''. EclipseLink will parse the schema and generate '''DynamicTypes''' for each complex type.
+
 
+
EclipseLink MOXy uses Sun's XJC (XML-to-Java Compiler) APIs to parse the schema into an in-memory representation and  generate DynamicTypes and Mappings.
+
<div style="margin-left:40px;width:65%">
+
 
+
{{tip||When bootstrapping from XSD, you will need to include <tt>jaxb-xjc.jar</tt> (from the JAXB reference implementation) on your <tt>CLASSPATH</tt>.}}
+
 
+
</div>
+
 
+
 
+
You can pass the XML Schema to DynamicJAXBContextFactory by using:
+
*'''InputStream'''
+
*'''Node'''
+
*'''Source'''
+
 
+
The following example demonstrates these methods:
+
<source lang="java">
+
 
+
/**
+
* Create a DynamicJAXBContext, using XML Schema as the metadata source.
+
*
+
* @param schemaStream
+
*      java.io.InputStream from which to read the XML Schema.
+
* @param resolver
+
*      An org.xml.sax.EntityResolver, used to resolve schema imports.  Can be null.
+
* @param classLoader
+
*      The application's current class loader, which will be used to first lookup
+
*      classes to see if they exist before new DynamicTypes are generated.  Can be
+
*      null, in which case Thread.currentThread().getContextClassLoader() will be used.
+
* @param properties
+
*      Map of properties to use when creating a new DynamicJAXBContext.  Can be null.
+
*
+
* @return
+
*      A new instance of DynamicJAXBContext.
+
*
+
* @throws JAXBException
+
*      if an error was encountered while creating the DynamicJAXBContext.
+
*/
+
public static DynamicJAXBContext createContextFromXSD(java.io.InputStream schemaStream, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
public static DynamicJAXBContext createContextFromXSD(org.w3c.dom.Node schemaDOM, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
public static DynamicJAXBContext createContextFromXSD(javax.xml.transform.Source schemaSource, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
</source>
+
 
+
 
+
{{tip||The <tt>classLoader</tt> parameter is your application's current class loader, and will be used to first lookup classes to see if they exist before new <tt>DynamicTypes</tt> are generated. The user may pass in null for this parameter, and <tt>Thread.currentThread().getContextClassLoader()</tt> will be used instead.}}
+
 
+
 
+
 
+
 
+
=== Example ===
+
 
+
This example shows how to create and marshall a new object using Dynamic MOXy.
+
 
+
 
+
Sample XML Schema:
+
<source lang="xml">
+
 
+
<?xml version="1.0" encoding="UTF-8"?>
+
<xs:schema targetNamespace="mynamespace" xmlns:myns="mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+
    attributeFormDefault="qualified" elementFormDefault="qualified">
+
 
+
    <xs:element name="customer" type="myns:customer"/>
+
 
+
    <xs:complexType name="customer">
+
        <xs:sequence>
+
            <xs:element name="first-name" type="xs:string"/>
+
            <xs:element name="last-name" type="xs:string"/>
+
            <xs:element name="address" type="myns:address"/>
+
        </xs:sequence>
+
    </xs:complexType>
+
 
+
    <xs:complexType name="address">
+
        <xs:sequence>
+
            <xs:element name="street" type="xs:string"/>
+
            <xs:element name="city" type="xs:string"/>
+
            <xs:element name="province" type="xs:string"/>
+
            <xs:element name="postal-code" type="xs:string"/>
+
        </xs:sequence>
+
    </xs:complexType>
+
 
+
</xs:schema>
+
 
+
</source>
+
 
+
The following code:
+
* Passes the XML Schema to <tt>DynamicJAXBContextFactory</tt> to create a <tt>DynamicJAXBContext</tt>
+
* Creates new <tt>DynamicEntities</tt> and setting their properties
+
* Creates a <tt>JAXBMarshaller</tt> and marshalling the Java objects to XML
+
 
+
<source lang="java">
+
 
+
InputStream inputStream = myClassLoader.getSystemResourceAsStream("mynamespace/resources/xsd/customer.xsd");
+
DynamicJAXBContext dContext = DynamicJAXBContextFactory.createContextFromXSD(inputStream, null, myClassLoader, null);
+
 
+
DynamicEntity newCustomer = dContext.newDynamicEntity("mynamespace.Customer");
+
newCustomer.set("firstName", "George");
+
newCustomer.set("lastName", "Jones");
+
 
+
DynamicEntity newAddress = dContext.newDynamicEntity("mynamespace.Address");
+
newAddress.set("street", "227 Main St.");
+
newAddress.set("city", "Toronto");
+
newAddress.set("province", "Ontario");
+
newAddress.set("postalCode", "M5V1E6");
+
 
+
newCustomer.set("address", newAddress);
+
 
+
dContext.createMarshaller().marshal(newCustomer, System.out);
+
 
+
</source>
+
 
+
==Importing other Schemas / EntityResolvers==
+
*http://wiki.eclipse.org/EclipseLink/Development/2.1/DynamicMOXy/296967/Documentation#Importing_other_Schemas_.2F_EntityResolvers
+
 
+
=Customizing Generated Mappings with EclipseLink Metadata =
+
*http://wiki.eclipse.org/EclipseLink/Development/2.1/DynamicMOXy/296967/Documentation#Customizing_Generated_Mappings_with_EclipseLink_Metadata
+
 
+
 
+
 
+
{{EclipseLink_MOXy
+
|next= [[http://wiki.eclipse.org/EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/Single_Project_Dynamic|From a Single Project]]
+
|previous= [[EclipseLink/UserGuide/MOXy/Runtime/Specifying_the_EclipseLink_Runtime/Using_DynamicEntities|Specying Dynamic JAXB Runtime]]
+
|up=      [[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping_Dynamic|Dynamic JAXB Bootstrapping]]
+
|version=2.2.0 - DRAFT}}
+

Latest revision as of 10:36, 8 November 2012

See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm

Back to the top