42

@XMLRootElement用和注释类有什么区别@XMLType。我一直在注释类,@XMLType何时该结构将在 XML 模式中多次使用以及@XMLRootElement何时仅使用一次 - 这是最好的方法吗?

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

我将这些注释与 JAX-WS 注释结合使用来创建 Web 服务,如果这有什么不同的话。

4

2 回答 2

23

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

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

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

<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>
于 2012-07-17T13:59:34.550 回答
17

当结构将在 XML 模式中多次使用时,我一直在使用 @XMLType 注释类,而在仅使用一次时使用 @XMLRootElement - 这是最好的方法吗?

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

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


@XmlRootElement

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

角色 #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();

角色 #2 - 替换组

注释将@XmlElementRef实例化的对象类型委托给元素的名称/uri。这使得能够映射到用于表示继承的替换组的概念。

角色 #3 - 任何内容

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


@XmlType

角色 #1 - 模式生成

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

角色 #2 - 继承和 xsi:type

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

角色 #3 - 道具订单

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

角色 #4 - 工厂方法

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


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

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

@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
    ...
}
于 2012-07-17T15:57:28.590 回答