用@XMLRootElement和@XMLType注释一个类有什么区别。当结构在XML schema中多次使用时,我一直使用@XMLType注释类;当结构只使用一次时,我使用@XMLRootElement注释类-这是最好的方法吗?
我将在这里包含一个不同但相关的问题。@XMLType注释有一个propOrder属性来指定其元素的出现顺序- @XMLRootElement是否有等效项
我将结合使用这些注释和JAX-WS注释来创建web服务,如果这样做会有所不同的话。
发布于 2012-07-17 21:59:35
XmlRootElement和XmlType之间的区别在于作用域的问题。请记住,此注释仅指示用于生成XML的模式的创建。XmlRootElement表示全局元素(具有匿名或模式类型):
<xs:element name=foo type="bar"> </xs:element> <-- schema type而XmlType用于表示本地元素(具有匿名或复杂类型):
<xs:complexType name=bar> </xs:complexType> <-- complex typelocal/global的主要区别在于您的对象将出现在模式的层次结构中,以及您声明的是模式类型还是复杂类型。这两个注释的文档都写得很好,并且包括示例:
XmlRootElement
XmlType
编辑:解决propOrder问题:如果还声明局部类型,则可以在全局元素上使用它:
@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>发布于 2012-07-17 23:57:29
当结构在
模式中被多次使用时,我一直使用@XMLType注释类;当它只被使用一次时,我一直使用@XMLRootElement --这是最好的方法吗?
要知道的一件事是,@XmlRootElement或@XmlType注释都不是必需的。它们不是来自JPA的@Entity的等价物。您可以使用不带任何注释的实现:
下面我将解释@XmlRootElement和@XmlType是做什么的。
@XmlRootElement
有时,您的JAXB实现只需要根据正在处理的XML元素实例化一个对象。@XmlRootElement注释是指定此关联的主要方法。注意:如果一个类对应于一个以上的XML元素,那么应该使用@XmlElementDecl注释,
角色#1 -指定根对象
@XmlRootElement主要用于指定根对象。当您的JAXB实现开始解组XML文档时,它就知道要实例化哪个对象。几乎所有后续注释都将基于从父类收集的信息。
Foo
@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();角色#2 -替换组
@XmlElementRef注释将实例化的对象类型委托给元素的名称/uri。这使得能够映射到用于表示继承的代替组的概念。
角色#3 -任何内容
@XmlAnyElement允许您映射文档的通配符部分。如果指定@XmlAnyElement(lax=true),则与域对象关联的元素将转换为相应的域对象。
@XmlType
角色#1 -架构生成
默认情况下,会为JAXB上下文已知的每个Java类生成一个命名的复杂类型。您可以使用@XmlType注释控制此类型的名称,或者通过将名称指定为""来指定应生成匿名复杂类型。
角色#2 -继承和xsi:类型
缺省情况下,JAXB利用xsi:type属性作为继承指示符。此属性上的值对应于您在@XmlType注释上指定的名称和命名空间,或者是基于类的默认值。
角色#3 -属性订单
正如您所提到的,您可以使用@XmlType来指定属性顺序。
角色#4 -工厂方法
@XmlType允许您指定工厂类和/或方法,该工厂类和/或方法可用于实例域对象而不是默认构造函数。
一个不同但相关的问题,我将包含在这里。@XMLType注释有一个propOrder属性来指定它的元素出现的顺序-- @XMLRootElement是否有等价物?
不,propOrder方面属于@XmlType注释。这是有意义的,因为复杂类型负责指定(或缺少)顺序。当然,您可以同时使用这些注释。
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}https://stackoverflow.com/questions/11520724
复制相似问题