2012-07-17 34 views
35

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

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 estas anotaciones junto con las anotaciones de JAX-WS para crear servicios web si eso hace la diferencia.

Respuesta

17

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. El XmlRootElement denota un elemento global (con un tipo anónimo o esquema):

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

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

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

La principal las diferencias en local/global aquí están en la jerarquía del esquema en el que aparecerá su objeto y en si está declarando un tipo de esquema o tipo complejo. La documentación de estos dos anotaciones está bien escrito e incluye ejemplos:

XmlRootElement

XmlType

EDIT: Abordar la cuestión propOrder: se puede usar en un elemento global si también está declarando local tipo:

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

Esto dará lugar a 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> 
17

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