@XmlRootElement versus @XMLType


Cuál es la diferencia entre anotar una clase con @XMLRootElement y @XMLType. He estado anotando clases con @XMLType cuando la estructura se usará más de una vez dentro de un esquema XML y con @XMLRootElement cuando se usará solo una vez - ¿es este el mejor enfoque?

Una pregunta diferente pero relacionada que incluiré aquí. La anotación @XMLType tiene un atributo propOrder para especificar en qué orden aparecen sus elementos - ¿hay un equivalente para @XMLRootElement?

Estoy usando estos anotaciones en conjunto con anotaciones JAX-WS para crear servicios web si eso hace alguna diferencia.

Author: Carl Manaster, 2012-07-17

2 answers

La diferencia entre XmlRootElement y XmlType es una cuestión de alcance. Recuerde que esta anotación simplemente dicta la creación del esquema utilizado para generar su XML. XmlRootElement denota un elemento global (con un tipo anónimo o de esquema):

<xs:element name=foo type="bar"> </xs:element> <-- schema type

Mientras que el XmlType se usa para denotar un elemento local (con un tipo anónimo o complejo):

<xs:complexType name=bar> </xs:complexType> <-- complex type

Las principales diferencias en local / global aquí están en la jerarquía del esquema en el que aparecerá su objeto y si declarar un tipo de esquema o tipo complejo. La documentación para ambas anotaciones está bien escrita e incluye ejemplos:

XmlRootElement

XmlType

EDITAR: Abordar la pregunta propOrder: puede usarla en un elemento global si también está declarando un tipo local:

@XmlRootElement (name="PersonElement")
@XmlType (propOrder={"firstname", "lastname"})
public class People{
    @XmlElement
    public String firstname;
    public String lastname;
}

Esto producirá algo como:

<xs:element name="PersonElement" type="People"/>
<xs:complexType name="People">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>
 20
Author: DocWatson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-28 19:18:43

He estado anotando clases con @XMLType cuando la estructura será utilizado más de una vez dentro de un esquema XML y con @XmlRootElement cuando se utilizará solo una vez - ¿es este el mejor enfoque?

Una cosa a saber es que no se requiere la anotación @XmlRootElement o @XmlType. No son el equivalente de @Entity de JPA. Puedes usar un JAXB (JSR-222) implementación sin ninguna anotación nunca:

A continuación explicaré lo que @XmlRootElement y @XmlType hacen.


@XmlRootElement

Hay momentos en que su implementación JAXB necesita crear instancias de un objeto basado solo en el elemento XML que se está procesando. La anotación @XmlRootElement es el medio principal para especificar esta asociación. Nota si una clase corresponde a más de un elemento XML entonces el @XmlElementDecl la anotación se debe utilizar insteat,

ROL # 1-Especificar el Objeto Raíz

@XmlRootElement se utiliza principalmente para especificar el objeto raíz. Esto es así cuando su implementación JAXB comienza a desmarcar un documento XML, sabe qué objeto crear una instancia. Casi todas las anotaciones posteriores se basarán en la información recopilada de la clase padre.

Foo

@XmlRootElement(name="root")
public class Foo {

    private String name;

}

Bar

public class Bar {

    private String name;

}

XML

<root>
    <name>Jane Doe</name>
</root>

Demo

Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();

ROL # 2-Grupos de Sustitución

La anotación @XmlElementRef delega el tipo de objeto instanciado al nombre/uri del elemento. Esto permite la asignación al concepto de grupos de sustitución para representar herencia.

ROL # 3 - Cualquier contenido

@XmlAnyElement le permite asignar una sección de comodín de su documento XML. Si especifica @XmlAnyElement(lax=true), los elementos asociados con los objetos de dominio se convertirán en el dominio correspondiente objeto.


@XmlType

ROL #1-Schema 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 usando la anotación @XmlType, o especificar que se debe generar un tipo complejo anónimo especificando el nombre como "".

FUNCIÓN #2-Herencia y xsi: tipo

Por defecto JAXB aprovecha el atributo xsi:type como indicador de herencia. El valor de este atributo corresponde al nombre y espacio de nombres que ha especificado en la anotación @XmlType, o está predeterminado en función de la clase.

ROL # 3-Orden de la prop

Como usted menciona puede utilizar el @XmlType para especificar la orden de propiedad.

ROLE # 4-Métodos de fábrica

@XmlType permite especificar una clase y/o método de fábrica que se puede utilizar para crear instancias del objeto domain en lugar del constructor predeterminado.


Una pregunta diferente pero relacionada que incluiré aquí. El @XMLType anotación tiene un atributo propOrder para especificar en qué orden es aparecen elementos - hay 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 (o falta de) orden. Por supuesto, puede usar estas anotaciones al mismo tiempo.

@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
    ...
}
 17
Author: Blaise Doughan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-17 18:44:36