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/Single Project/From sessions.xml using DynamicEntities"

m
m (Replacing page with ''''Warning This page is obsolete. Please see ''[http://www.eclipse.org/eclipselink/documentation/2.4/ Developing JAXB Applications Using EclipseLi...')
 
(3 intermediate revisions by 2 users not shown)
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
+
}}
+
 
+
= 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:''' &lt;sorce lang="java"&gt; customerDescriptor.setJavaClass(mynamespace.Customer.class); ... addressMapping.setReferenceClass(mynamespace.Address.class); &lt;/source&gt;
+
 
+
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}}
+

Latest revision as of 13:09, 30 January 2013

Warning This page is obsolete. Please see Developing JAXB Applications Using EclipseLink MOXy for current information.

Back to the top