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/Overview/DynamicEntities"

m (Replacing page with 'See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb001.htm')
 
Line 1: Line 1:
{{EclipseLink_UserGuide
+
See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb001.htm
|info=y
+
|toc=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
}}
+
=Static and Dynamic Entities=
+
 
+
There are two high-level ways to use EclipseLink JAXB; Using pre-existing Java classes (Static MOXy), or using EclipseLink-generated in-memory Java classes (Dynamic MOXy).
+
 
+
 
+
==Using Static MOXy==
+
 
+
The most common way to use EclipseLink JAXB is with existing Java classes, mapped to XML using Java annotations and/or EclipseLink OXM metadata.  These classes might be ones that you have written yourself, or they could be generated from an XML Schema using the XJC compiler tool.
+
 
+
Using this approach, you will be dealing with your actual domain objects when converting to and from XML.  The following example shows a simple Java class that can be used with JAXB:
+
 
+
<source lang="java">
+
import javax.xml.bind.annotation.XmlAttribute;
+
import javax.xml.bind.annotation.XmlRootElement;
+
 
+
@XmlRootElement
+
public class Customer {
+
  @XmlAttribute
+
  private long id;
+
 
+
  private String name;
+
 
+
  // ...
+
  // get() and set() methods
+
  // ...
+
}
+
</source>
+
 
+
{{tip||When using static classes with JAXB, you can take advantage of JAXB's defaulting behaviour and only annotate things which differ from the default.  For example, all fields on a Java class will default to being mapped to an XML element, so no annotation is needed on the 'name' field.  We want the 'id' field, however, to map to an XML attribute, so have annotated it as such.}}
+
 
+
 
+
The code below demonstrates how to unmarshal, modify, and marshal an object using static JAXB:
+
 
+
<source lang="java">
+
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class, Address.class);
+
Customer customer = (Customer) jaxbContext.createUnmarshaller().unmarshal(instanceDoc);
+
 
+
Address address = new Address();
+
address.setStreet("1001 Fleet St.");
+
+
customer.setAddress(address);
+
 
+
jaxbContext.createMarshaller().marshal(customer, System.out);
+
</source>
+
 
+
 
+
==Using Dynamic MOXy==
+
 
+
With EclipseLink Dynamic MOXy, you can bootstrap a '''JAXBContext''' from a variety of metadata sources and use existing JAXB APIs to marshal and unmarshal data… ''without having compiled Java class files on the classpath''. This allows you to alter the metadata as needed, without having to update and recompile the previously-generated Java source code.
+
 
+
You should consider using Dynamic MOXy when:
+
*You want EclipseLink to generate mappings from an XML schema (XSD).
+
*You do not want to deal with concrete Java domain classes.
+
 
+
 
+
===Dynamic Entities===
+
 
+
Instead of using actual Java classes (such as '''Customer.class''' or '''Address.class'''), Dynamic MOXy uses a simple '''get(propertyName)''' / '''set(propertyName, propertyValue)''' API to manipulate data. EclipseLink generates (in memory) a '''DynamicType''' associated with each '''DynamicEntity'''.
+
 
+
{{tip||'''DynamicTypes''' are similar to Java classes; whereas '''DynamicEntities''' can be thought of as instances of a '''DynamicType'''.}}
+
 
+
 
+
The code below demonstrates how to unmarshal, modify, and marshal an object using dynamic JAXB:
+
 
+
<source lang="java">
+
DynamicJAXBContext dynamicJAXBContext = DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, myClassLoader, null);
+
DynamicEntity customer = (DynamicEntity) dynamicJAXBContext.createUnmarshaller().unmarshal(instanceDoc);
+
+
String lastName = customer.get("lastName");
+
List orders = customer.get("orders");
+
...
+
DynamicEntity address = dynamicJAXBContext.newDynamicEntity("mynamespace.Address");
+
address.set("street", "1001 Fleet St.");
+
+
customer.set("lastName", lastName + "Jr.");
+
customer.set("address", address);
+
 
+
dynamicJAXBContext.createMarshaller().marshal(customer, System.out);
+
</source>
+
 
+
 
+
{{tip||XML names found in the metadata (complex type names, element names, attribute names) will be translated to Java identifiers according to the algorithms described in "Appendix D: Binding XML Names to Java Identifiers" of the ''Java Architecture for XML Binding (JAXB) 2.2 Specification''.  In the example above, "last-name" in XML was translated to "lastName" for the Java object.}}
+
[http://jcp.org/en/jsr/detail?id=222 Java Architecture for XML Binding (JAXB) 2.2 Specification]
+

Latest revision as of 10:35, 8 November 2012

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

Back to the top