@XMLRootElement与@XmlType
用@XMLRootElement
和@XMLType
注解类有@XMLRootElement
@XMLType
? 我一直在使用@XMLType
注解类,如果这个结构将在XML模式中被多次使用,并且在@XMLRootElement
被使用一次,那么这是最好的方法吗?
一个不同的但相关的问题,我将在这里包括。 @XMLType
注解有一个propOrder属性来指定它的元素出现的顺序 – 是否有@XMLRootElement
的等价@XMLRootElement
?
我将这些注释与JAX-WS批注一起使用来创buildWeb服务,如果这有所帮助的话。
XmlRootElement
和XmlType
之间的区别是作用域的问题。 请记住,这个注释只是为了创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 { ... }