EclipseLink/Release/2.4.0/JAXB RI Extensions/Namespace Prefix Mapper

Contents

Namespace Prefix Mapper

In the current JAXB RI, developed by Sun, there is a series of "proprietary" JAXB extensions which provide advanced functionality outside of the JAXB specification (these extension classes and properties reside in the com.sun.xml.bind package).

The NamespacePrefixMapper is one of these extensions - it allows the user to customize the namespaces and namespace prefixes used by a given Marshaller. By subclassing the abstract NamespacePrefixMapper class and setting an instance on the Marshaller, the user can control how prefixes are assigned.

Configuration

To use this feature, the user must create a subclass of the org.eclipse.persistence.oxm.NamespacePrefixMapper class, and then provide an instance of this subclass to the JAXB Marshaller:

marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, new MyPrefixMapper());

NamespacePrefixMapper contains the following methods that can be overridden in the subclass:

Returns any namespaces that should be declared in the document, even if they are not used. Namespaces returned will be assigned a generated prefix (i.e. "ns1", "ns2", etc)

Returned String[] is in the format { "namespace1", "namespace2", ... }

public String[] getPreDeclaredNamespaceUris2() (optional)

Returns any namespace prefix/uri pairs that should be declared in the document, even if they are not used.

Returned String[] is in the format { "prefix1", "namespace1", "prefix2", "namespace2", ... }

public String[] getContextualNamespaceDecls() (optional)

Returns any namespace prefix/uri pairs that should be used in the document, but not actually declared in the root of the XML. This is useful if the XML being marshalled is part of a larger document, which would have these namespaces declared higher up in the document.

Returned String[] is in the format { "prefix1", "namespace1", "prefix2", "namespace2", ... }

Note: EclipseLink also supports the Sun RI's equivalents: subclasses of com.sun.xml.bind.marshaller.NamespacePrefixMapper can also be set on a Marshaller, using the com.sun.xml.bind.namespacePrefixMapper property name.

EclipseLink also supports a simplified way to provide preferred namespace prefixes; instead of a NamespacePrefixMapper instance, you can pass the Marshaller a Map of uris/prefixes to use when marshalling: