@XMLRootElement versus @XmlType
jax-ws, jaxb, xml
Solution
The difference between `XmlRootElement` and `XmlType` is a matter of scoping. Remember this annotation is merely dictating the creation of the schema used to generate your XML. The `XmlRootElement` denotes a global element (with an anonymous or schema type):
<xs:element name=foo type="bar"> </xs:element> <-- schema type
while the `XmlType` is used to denote a local element (with an anonymous or complex type):
<xs:complexType name=bar> </xs:complexType> <-- complex type
The main differences in local/global here are in the hierarchy of the schema your object will appear in and whether you are declaring a schema type or complex type. The documentation for both of these annotations is well written and includes examples:
`XmlRootElement`
`XmlType`
EDIT: Addressing the `propOrder` question: you can use it on a global element if you are also declaring a local type:
@XmlRootElement (name="PersonElement")
@XmlType (propOrder={"firstname", "lastname"})
public class People{
@XmlElement
public String firstname;
public String lastname;
}
This will yield something like:
<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>
Problem
What's the difference between annotating a class with `@XMLRootElement` and `@XMLType`. I've been annotating classes with `@XMLType` when the structure will be used more than once within an XML schema and with `@XMLRootElement` when it will be used only once - is this the best approach? A different but related question which I'll include here. The `@XMLType` annotation has an propOrder attribute to specify in which order its elements appear - is there an equivalent for `@XMLRootElement`? I'm using these annotations in conjunction with JAX-WS annotations to create web services if that makes any difference.