|
|
Line 1: |
Line 1: |
− | {{EclipseLink_UserGuide
| + | '''[[Image:Elug_draft_icon.png|Warning]] This page is obsolete. Please see ''[http://www.eclipse.org/eclipselink/documentation/2.4/ Developing JAXB Applications Using EclipseLink MOXy]'' for current information.''' |
− | |info=y
| + | |
− | |eclipselink=y
| + | |
− | |eclipselinktype=MOXy
| + | |
− | |api=y
| + | |
− | |apis= * [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContextFactory.html DynamicJAXBContextFactory]}}
| + | |
− | | + | |
− | = Dynamic Bootstrapping (Single Project) from sessions.xml (EclipseLink project) =
| + | |
− | | + | |
− | With EclipseLink dynamic MOXy, you can bootstrapping from an EclipseLink project specified in '''sessions.xml''' file. In this scenario, your specifies only Java ''class names'' -- not the actual Java classes, as shown here:
| + | |
− | | + | |
− | '''CORRECT:''' <source lang="java">
| + | |
− | customerDescriptor.setJavaClassName("mynamespace.Customer");
| + | |
− | ...
| + | |
− | addressMapping.setReferenceClassName("mynamespace.Address");
| + | |
− | </source>
| + | |
− | | + | |
− | '''INCORRECT:''' <source lang="java">
| + | |
− | customerDescriptor.setJavaClass(mynamespace.Customer.class);
| + | |
− | ...
| + | |
− | addressMapping.setReferenceClass(mynamespace.Address.class);
| + | |
− | </source>
| + | |
− | | + | |
− | You map these "imaginary" classes to XML. EclipseLink dynamically generates the classes in memory, when buildingn the '''DynamicJAXBContext'''.
| + | |
− | | + | |
− | Add your EclipseLink project to the EclipseLink '''sessions.xml''' file. Use the following API to pass the session's name to the '''DynamicJAXBContextFactory''' and create your '''DynamicJAXBContext''':
| + | |
− | | + | |
− | <source lang="Java">
| + | |
− | | + | |
− | /**
| + | |
− | * Create a <tt>DynamicJAXBContext</tt>, using an EclipseLink <tt>sessions.xml</tt> as the metadata source.
| + | |
− | * The <tt>sessionNames</tt> parameter is a colon-delimited list of session names within the
| + | |
− | * <tt>sessions.xml</tt> file. <tt>Descriptors</tt> in this session's <tt>Project</tt> must <i>not</i>
| + | |
− | * have <tt>javaClass</tt> set, but <i>must</i> have <tt>javaClassName</tt> set.
| + | |
− | *
| + | |
− | * @param sessionNames
| + | |
− | * A colon-delimited <tt>String</tt> specifying the session names from the <tt>sessions.xml</tt> file.
| + | |
− | * @param classLoader
| + | |
− | * The application's current class loader, which will be used to first lookup
| + | |
− | * classes to see if they exist before new <tt>DynamicTypes</tt> are generated. Can be
| + | |
− | * <tt>null</tt>, in which case <tt>Thread.currentThread().getContextClassLoader()</tt> will be used.
| + | |
− | * @param properties
| + | |
− | * Map of properties to use when creating a new <tt>DynamicJAXBContext</tt>. Can be null.
| + | |
− | *
| + | |
− | * @return
| + | |
− | * A new instance of <tt>DynamicJAXBContext</tt>.
| + | |
− | *
| + | |
− | * @throws JAXBException
| + | |
− | * if an error was encountered while creating the <tt>DynamicJAXBContext</tt>.
| + | |
− | */
| + | |
− | public static DynamicJAXBContext createContext(String sessionNames, ClassLoader classLoader,
| + | |
− | Map<String, ?> properties) throws JAXBException
| + | |
− | </source>
| + | |
− | | + | |
− | <br>
| + | |
− | | + | |
− | == Example ==
| + | |
− | | + | |
− | This example shows an EclipseLink MOXy project in code. Notice that:
| + | |
− | | + | |
− | *The package name of the generated classes will be '''com.mypackage'''.
| + | |
− | **If you were importing from an XSD, you would have used the default namespace to build the package, resulting in '''mynamespace''' instead.
| + | |
− | *The '''first-name''' element in XML will be mapped to the '''fName''' field in Java
| + | |
− | **If you were importing from an XSD, the generated field name would have been '''firstName'''.
| + | |
− | *A null address will be represented by '''xsi:nil="true"''' in XML.
| + | |
− | | + | |
− | <source lang="Java">
| + | |
− | package mynamespace;
| + | |
− |
| + | |
− | import org.eclipse.persistence.oxm.NamespaceResolver;
| + | |
− | import org.eclipse.persistence.oxm.XMLConstants;
| + | |
− | import org.eclipse.persistence.oxm.XMLDescriptor;
| + | |
− |
| + | |
− | import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
| + | |
− | import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
| + | |
− |
| + | |
− | public class CustomerProject extends org.eclipse.persistence.sessions.Project {
| + | |
− |
| + | |
− | public CustomerProject() {
| + | |
− | super();
| + | |
− |
| + | |
− | NamespaceResolver nsResolver = new NamespaceResolver();
| + | |
− | nsResolver.put("ns0", "mynamespace");
| + | |
− | nsResolver.put("xsi", XMLConstants.SCHEMA_INSTANCE_URL);
| + | |
− |
| + | |
− | XMLDescriptor customerDescriptor = new XMLDescriptor();
| + | |
− | customerDescriptor.setJavaClassName("mynamespace.Customer");
| + | |
− | customerDescriptor.setDefaultRootElement("customer");
| + | |
− | customerDescriptor.setNamespaceResolver(nsResolver);
| + | |
− |
| + | |
− | XMLDirectMapping firstNameMapping = new XMLDirectMapping();
| + | |
− | firstNameMapping.setAttributeName("fName");
| + | |
− | firstNameMapping.setXPath("first-name/text()");
| + | |
− | customerDescriptor.addMapping(firstNameMapping);
| + | |
− | // ...
| + | |
− |
| + | |
− | XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
| + | |
− | addressMapping.setAttributeName("address");
| + | |
− | addressMapping.setXPath("address");
| + | |
− | addressMapping.setReferenceClassName("mynamespace.Address");
| + | |
− | addressMapping.getNullPolicy().setNullRepresentedByXsiNil(true);
| + | |
− | addressMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
| + | |
− | customerDescriptor.addMapping(addressMapping);
| + | |
− |
| + | |
− | XMLDescriptor addressDescriptor = new XMLDescriptor();
| + | |
− | addressDescriptor.setJavaClassName("mynamespace.Address");
| + | |
− | // ...
| + | |
− |
| + | |
− | this.addDescriptor(customerDescriptor);
| + | |
− | this.addDescriptor(addressDescriptor);
| + | |
− | }
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | </source>
| + | |
− | | + | |
− | Here is the '''sessions.xml'' that includes the project:
| + | |
− | | + | |
− | <source lang="xml">
| + | |
− | <?xml version="1.0" encoding="US-ASCII"?>
| + | |
− | <sessions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...>
| + | |
− | <session xsi:type="database-session">
| + | |
− | <name>MyCustomerProject</name>
| + | |
− | <primary-project xsi:type="class">mynamespace.CustomerProject</primary-project>
| + | |
− | </session>
| + | |
− | </sessions>
| + | |
− | </source>
| + | |
− | | + | |
− | Now, you instantiate a '''DynamicJAXBContext''' using the session name and begin working with the '''DynamicEntities''':
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | DynamicJAXBContext dContext = DynamicJAXBContextFactory.createContext("MyCustomerProject", null, null);
| + | |
− |
| + | |
− | DynamicEntity newCustomer = dContext.newDynamicEntity("com.mypackage.Customer");
| + | |
− | newCustomer.set("fName", "Bob");
| + | |
− | ...
| + | |
− | dContext.createMarshaller().marshal(newCustomer, System.out);
| + | |
− | </source>
| + | |
− | | + | |
− | <br> {{tip||You can specify multiple '''Session''' names when bootstrapping from an EclipseLink project, by using:
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | DynamicJAXBContextFactory.createContext("ProjectA:ProjectB", null, null);
| + | |
− | </source>
| + | |
− | | + | |
− | This creates a single <tt>DynamicJAXBContext</tt> that is aware of <tt>Mappings</tt> and <tt>Descriptors</tt> from both <tt>Projects</tt>.}}
| + | |
− | | + | |
− | <br> {{EclipseLink_MOXy
| + | |
− | |next = [[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/Multiple_Project|From multiple projects]]
| + | |
− | |previous =[[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/Single_Project/From_OXM_using_DynamicEntities|From OXM]]
| + | |
− | |up =[[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/Single_Project_Dynamic|From a single project]]
| + | |
− | |version=2.2.0 DRAFT}}
| + | |