Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

EclipseLink/Development/2.1/DynamicMOXy/296967/BootstrapFromOXM/ObjectFactory

< EclipseLink‎ | Development‎ | 2.1‎ | DynamicMOXy/296967‎ | BootstrapFromOXM
Revision as of 14:57, 2 September 2010 by Unnamed Poltroon (Talk) (Why is ObjectFactory needed?)

Supporting ObjectFactory in Dynamic JAXB

Background

In standard JAXB, when classes are generated from a schema, an ObjectFactory class is also created, with methods to create new instances of all types in the schema, etc. From the JAXB 2.2 spec:

Idea.png
A public class ObjectFactory contains:

An instance factory method signature for each Java content within the package:

public Foo createFoo();

An element instance factory method signature for each bound element declaration:

public JAXBElement<T> createFoo(T elementValue);

Dynamic instance factory allocator method signature:

public Object newInstance(Class javaContentInterface);

Property setter/getter:

public Object getProperty(String name);

public void setProperty(String name, Object value);

The ObjectFactory is home to the XmlRegistry and XmlElementDecl annotations

Why is ObjectFactory needed?

Consider the following XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema ...>
 
    <xs:element name="individuo" type="myns:person"/>
 
    <xs:complexType name="person">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
 
</xs:schema>

In this case, the user has a complex type called "Person" but they would like the resulting XML to use "individuo" as its XML element name.

In standard JAXB we would get a ObjectFactory that looks like this:

@XmlRegistry
public class ObjectFactory {
    private final static QName _Individuo_QNAME = new QName("myNamespace", "individuo");
 
    public ObjectFactory() {}
 
    public Person createPerson() {
        return new Person();
    }
 
    @XmlElementDecl(namespace = "myNamespace", name = "individuo")
    public JAXBElement<Person> createIndividuo(Person value) {
        return new JAXBElement<Person>(_Individuo_QNAME, Person.class, null, value);
    }
}

In standard static EclipseLink JAXB, when processing annotations we will look at the ObjectFactory, see the XmlElementDecl annotation, and set the Person Descriptor's default root element to be "individuo".

The Dynamic Problem

Bootstrapping from XSD

Bootstrapping from OXM

Back to the top