Difference between revisions of "EclipseLink/UserGuide/MOXy/Advanced Concepts/Refreshing Metadata"

From Eclipsepedia

Jump to: navigation, search
m
m (Refreshing Metadata)
Line 11: Line 11:
 
= Refreshing Metadata =
 
= Refreshing Metadata =
 
{{EclipseLink_NewIn
 
{{EclipseLink_NewIn
|version=2.3
+
|version=2.3.0
 
}}  
 
}}  
 
EclipseLink MOXy '''2.3''' introduces the ability to refresh your '''JAXBContext's''' metadata at runtime.  This allows you to make changes to existing mappings in a live application environment and see those changes immediately without having to create a new '''JAXBContext'''.
 
EclipseLink MOXy '''2.3''' introduces the ability to refresh your '''JAXBContext's''' metadata at runtime.  This allows you to make changes to existing mappings in a live application environment and see those changes immediately without having to create a new '''JAXBContext'''.

Revision as of 12:07, 29 June 2011


Contents


Refreshing Metadata

EL NewIn.png New in version 2.3.0.

EclipseLink MOXy 2.3 introduces the ability to refresh your JAXBContext's metadata at runtime. This allows you to make changes to existing mappings in a live application environment and see those changes immediately without having to create a new JAXBContext.

In order to use the Metadata Refresh feature, your metadata information must be provided in one of the following formats:

  • javax.xml.transform.Source
  • org.w3c.dom.Node
  • org.eclipse.persistence.jaxb.metadata.MetadataSource


Example

Our example will be bootstrapped from the following EclipseLink OXM file:

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="example">
    <java-types>
        <java-type name="Root">
            <java-attributes>
                <xml-element java-attribute="name" name="orig-name"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Our JAXBContext is created in the standard way:

...
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream metadataStream = classLoader.getResourceAsStream("example/eclipselink-oxm.xml";
Document metadataDocument = db.parse(metadataStream);
metadataStream.close();
 
Map<String, Object> props = new HashMap<String, Object>(1);
props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataDocument);
JAXBContext context = JAXBContextFactory.createContext(new Class[] { Root.class }, props);
...

At this point, if we were to marshal a Root object to XML, it would look like this:

<root>
    <orig-name>RootName</orig-name>
</root>

For this example, we will modify the metadata Document directly to change the XML name for the name field. We can then refresh the metadata using the refreshMetadata() API:

...
Element xmlElementElement = (Element) metadataDocument.getElementsByTagNameNS("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element").item(0);
xmlElementElement.setAttribute("name", "new-name");
JAXBHelper.getJAXBContext(jc).refreshMetadata();
...

After refreshing metadata, the same Root object will be marshalled as follows:

<root>
    <new-name>RootName</new-name>
</root>