@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.
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:
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>
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 {
...
}
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