Soy nuevo en el uso de JAXB, y usé xjc de JAXB 2.1.3 para generar un conjunto de clases a partir de mi esquema XML. Además de generar una clase para cada elemento en mi esquema, creó una clase ObjectFactory.
No parece haber nada que me impida instanciar los elementos directamente, por ejemplo
MyElement element = new MyElement();
mientras que los tutoriales parecen preferir
MyElement element = new ObjectFactory().createMyElement();
Si miro en ObjectFactory.java, veo:
public MyElement createMyElement() {
return new MyElement();
}
entonces cual es el trato? ¿Por qué debería molestarme en mantener la clase ObjectFactory? Supongo que también se sobrescribirá si tuviera que volver a compilar a partir de un esquema alterado.

Respuestas:
La compatibilidad con versiones anteriores no es la única razón. :-PAGS
Con esquemas más complicados, como los que tienen restricciones complicadas sobre los valores que puede asumir el contenido de un elemento, a veces es necesario crear
JAXBElementobjetos reales . Por lo general, no son triviales de crear a mano, por lo que loscreate*métodos hacen el trabajo duro por usted. Ejemplo (del esquema XHTML 1.1):Así es como se coloca una
<style>etiqueta en una<head>etiqueta:Los primeros tres usos de la
ObjectFactorypodrían considerarse superfluos (aunque útiles para la coherencia), pero el cuarto hace que JAXB sea mucho, mucho más fácil de usar. ¡Imagina tener que escribirnew JAXBElementa mano cada vez!fuente
Como señaló @Chris, a veces JAXB no puede funcionar con POJO, porque el esquema no se puede asignar exactamente a Java. En estos casos,
JAXBElementobjetos contenedores son necesarios para proporcionar la información de tipo adicional.Hay dos ejemplos concretos que he encontrado en los que esto es común.
Si desea ordenar un objeto de una clase que no tiene la
@XmlRootElementanotación. Por defecto, XJC solo genera@XmlRootElementpara algunos elementos y no para otros. La lógica exacta para esto es un poco complicada, pero puede forzar a XJC a generar más@XmlRootElementclases usando el "modo de enlace simple"Cuando su esquema usa grupos de sustitución. Este es un uso de esquema bastante avanzado, pero XJC traduce los grupos de sustitución a Java haciendo un uso intensivo de
JAXBElementenvoltorios.Entonces, en un modelo de objetos generado por XJC que hace un uso intensivo de
JAXBElement(por cualquier motivo), necesita una forma de construir esasJAXBElementinstancias. El generadoObjectFactoryes, con mucho, la forma más fácil de hacerlo. Usted puede ellas la construcción de sí mismo, pero es torpe y propenso a errores de hacerlo.fuente
Compatibilidad con versiones anteriores, supongo ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
fuente