He estado Anotación de clases con @XmlType cuando la estructura será utilizarse más de una vez dentro de un esquema XML y con @XmlRootElement cuando se va a utilizar sólo una vez - es este el mejor enfoque?
Una cosa a saber es que no se requiere ni la @XmlRootElement
o @XmlType
anotación. No son el equivalente de @Entity
de JPA. Puede utilizar una aplicación JAXB (JSR-222) sin anotaciones lo que nunca:
A continuación voy a explicar lo que @XmlRootElement
y @XmlType
lo hacen.
@XmlRootElement
Hay momentos en que su aplicación JAXB necesita para crear instancias de un objeto basándose únicamente en el elemento XML que se está procesando. La anotación @XmlRootElement
es el medio principal para especificar esta asociación. Tenga en cuenta si una clase corresponde a más de un elemento XML insteat entonces el @XmlElementDecl
anotación se debe utilizar,
PAPEL # 1 - Especificación del objeto raíz
@XmlRootElement
se utiliza principalmente para especificar el objeto raíz. Esto es así cuando la implementación de JAXB comienza a desasociar un documento XML, sabe qué objeto crear. Casi todas las anotaciones posteriores se basarán en la información recopilada de la clase principal.
Foo
@XmlRootElement(name="root")
public class Foo {
private String name;
}
Bar
public class Bar {
private String name;
}
XML
<root>
<name>Jane Doe</name>
</root>
demostración
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();
PAPEL # 2 - Sustitución Grupos
Los delegados @XmlElementRef
de anotación del tipo de objeto instanciado al nombre/URI del elemento. Esto permite mapear el concepto de grupos de sustitución para representar la herencia.
PAPEL # 3 - Cualquier contenido
@XmlAnyElement
le permite asignar una sección comodín del documento XML. Si especifica @XmlAnyElement(lax=true)
, los elementos asociados con objetos de dominio se convertirán al objeto de dominio correspondiente.
@XmlType
PAPEL # 1 - Esquema Gen
Por defecto se genera un tipo complejo con nombre para cada clase Java conocida por el Contexto JAXB. Puede controlar el nombre de este tipo utilizando la anotación @XmlType
, o especificar que se genere un tipo complejo anónimo especificando el nombre como ""
.
PAPEL # 2 - Herencia y xsi: type
Por defecto JAXB aprovecha el atributo xsi:type
como el indicador de herencia. El valor de este atributo corresponde al nombre y espacio de nombre que ha especificado en la anotación @XmlType
, o está predeterminado de acuerdo con la clase.
PAPEL # 3 - Prop Solicitar
Como usted menciona puede utilizar el @XmlType
para especificar el orden propiedad.
PAPEL # 4 - Métodos de fábrica
@XmlType
le permite especificar una clase de fábrica y/o método que se puede utilizar para crear una instancia del objeto de dominio en lugar del predeterminado constructor.
Una cuestión diferente pero relacionado que voy a incluir aquí. La anotación @XMLType tiene un atributo propOrder para especificar en qué orden aparecen los elementos , ¿existe un equivalente para @XMLRootElement?
No, el aspecto propOrder
pertenece a la anotación @XmlType
. Esto tiene sentido ya que los tipos complejos son responsables de especificar un orden (o falta de). Por supuesto, puede utilizar estas anotaciones al mismo tiempo.
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}