@XMLRootElement与@XmlType

@XMLRootElement@XMLType注解类有@XMLRootElement @XMLType ? 我一直在使用@XMLType注解类,如果这个结构将在XML模式中被多次使用,并且在@XMLRootElement被使用一次,那么这是最好的方法吗?

一个不同的但相关的问题,我将在这里包括。 @XMLType注解有一个propOrder属性来指定它的元素出现的顺序 – 是否有@XMLRootElement的等价@XMLRootElement

我将这些注释与JAX-WS批注一起使用来创buildWeb服务,如果这有所帮助的话。

XmlRootElementXmlType之间的区别是作用域的问题。 请记住,这个注释只是为了创build用于生成XML的模式的创build。 XmlRootElement表示全局元素(具有匿名或模式types):

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

XmlType用来表示本地元素(具有匿名或复杂types):

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

本地/全局的主要区别在于对象将出现的模式层次结构,以及是否声明模式types或复杂types。 这两个注释的文档都写得很好,包括例子:

XmlRootElement

XmlType

编辑:解决propOrder问题:如果您还声明本地types,则可以在全局元素上使用它:

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

这将产生如下的东西:

 <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> 

我一直在使用@XMLType注解类,如果这个结构将在XML模式中被多次使用,并且在@XMLRootElement中被使用一次,那么这是最好的方法吗?

有一点要知道的是,不需要@XmlRootElement@XmlType注解。 它们不等同于来自JPA的@Entity 。 您可以使用JAXB(JSR-222)实现,不需要任何注释:

下面我将解释@XmlRootElement@XmlType作用。


@XmlRootElement

有时您的JAXB实现需要仅基于正在处理的XML元素来实例化对象。 @XmlRootElement注释是指定这种关联的主要方法。 请注意,如果一个类对应多个XML元素,则应该使用@XmlElementDecl注释,

angular色#1 – 指定根对象

@XmlRootElement主要用来指定根对象。 这是当你的JAXB实现开始解组一个XML文档时,它知道实例化哪个对象。 几乎所有后续的注释都将基于从父类收集的信息。

 @XmlRootElement(name="root") public class Foo { private String name; } 

酒吧

 public class Bar { private String name; } 

XML

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

演示

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

angular色#2 – replace组

@XmlElementRef注解将实例化的对象的types委托给元素的名称/ URI。 这使映射到替代组的概念来表示inheritance。

angular色#3 – 任何内容

@XmlAnyElement允许您映射XML文档的通配符部分。 如果指定@XmlAnyElement(lax=true)则与域对象关联的元素将被转换为相应的域对象。


@XmlType

angular色#1 – Schema Gen

默认情况下,将为JAXB上下文已知的每个Java类生成一个命名的复杂types。 您可以使用@XmlType注释来控制此types的名称,或指定通过将名称指定为""来生成一个匿名复杂types。

ROLE#2 – inheritance和xsi:types

默认情况下,JAXB利用xsi:type属性作为inheritance指示符。 此属性上的值对应于您在@XmlType注释中指定的名称和名称空间,或者是基于该类的默认值。

ROLE#3 – Prop Order

正如你所提到的,你可以使用@XmlType来指定属性顺序。

angular色#4 – 工厂方法

@XmlType允许你指定一个工厂类和/或方法,可以用来实例化域对象而不是默认的构造函数。


一个不同的但相关的问题,我将在这里包括。 @XMLType注解有一个propOrder属性来指定它的元素出现的顺序 – 是否有@XMLRootElement的等价物?

不, propOrder方面属于@XmlType注释。 这是有道理的,因为复杂的types负责指定(或缺乏)订单。 您当然可以同时使用这些注释。

 @XmlRootElement @XmlType(propOrder={"foo", "bar"} public class Root { ... }