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

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);
    }
}

Back to the top