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
JAXBElement
objetos 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
ObjectFactory
podrí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 JAXBElement
a 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,
JAXBElement
objetos 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
@XmlRootElement
anotación. Por defecto, XJC solo genera@XmlRootElement
para 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@XmlRootElement
clases 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
JAXBElement
envoltorios.Entonces, en un modelo de objetos generado por XJC que hace un uso intensivo de
JAXBElement
(por cualquier motivo), necesita una forma de construir esasJAXBElement
instancias. El generadoObjectFactory
es, 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