@XMLRootElement与@XmlType

时间:2012-07-17 10:35:23

标签: xml jaxb jax-ws

使用@XMLRootElement@XMLType注释课程之间的区别是什么。当结构将在XML模式中多次使用时,我一直使用@XMLType注释类,当@XMLRootElement仅使用一次时,我一直在使用@XMLType这是最好的方法吗?

我将在此处包含一个不同但相关的问题。 @XMLRootElement注释具有propOrder属性,用于指定其元素的显示顺序 - 是否存在{{1}}的等效项?

我正在将这些注释与JAX-WS注释结合使用,以创建Web服务,如果这有任何区别的话。

2 个答案:

答案 0 :(得分:21)

XmlRootElementXmlType之间的差异是范围问题。请记住,此注释仅指示用于生成XML的模式的创建。 XmlRootElement表示全局元素(具有匿名或模式类型):

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

XmlType用于表示本地元素(具有匿名或复杂类型):

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

本地/全局的主要区别在于您的对象将出现在的架构的层次结构中以及您是否声明架构类型或复杂类型。这两个注释的文档编写得很好,包括示例:

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>

答案 1 :(得分:17)

  

当结构出现时,我一直用@XMLType注释类   在XML模式中使用多次,在@XMLRootElement时使用   它只会被使用一次 - 这是最好的方法吗?

要知道的是,@XmlRootElement@XmlType注释都不是必需的。它们不等同于JPA的@Entity。你可以使用JAXB (JSR-222)实现而不需要任何注释:

下面我将解释@XmlRootElement@XmlType做什么。


<强> @XmlRootElement

有时,您的JAXB实现需要仅基于正在处理的XML元素来实例化对象。 @XmlRootElement注释是指定此关联的主要方法。请注意,如果一个类对应多个XML元素,那么{/ 1}}注释应该在insteat中使用,

角色#1 - 指定根对象

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

<强>

@XmlRootElement

<强> 酒吧

@XmlRootElement(name="root")
public class Foo {

    private String name;

}

<强> XML

public class Bar {

    private String name;

}

<强> 演示

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

角色#2 - 替换组

Foo foo = (Foo) unmarshaller.unmarshal(xml); Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue(); 注释将实例化的对象类型委托给元素的名称/ uri。这样就可以映射到替换组的概念来表示继承。

角色#3 - 任何内容

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


<强> @XmlAnyElement(lax=true)

角色#1 - 架构Gen

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

角色#2 - 继承和xsi:类型

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

角色#3 - 道具顺序

如您所述,您可以使用@XmlType指定属性订单。

角色#4 - 工厂方法

@XmlType允许您指定可用于实例化域对象而非默认构造函数的工厂类和/或方法。


  

我将在此处包含一个不同但相关的问题。 @XMLType   annotation有一个propOrder属性来指定它的顺序   元素出现 - 是否有@XMLRootElement的等价物?

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

@XmlType