@XMLRootElement与@XmlType

@XMLRootElement与@XmlType,xml,jaxb,jax-ws,Xml,Jaxb,Jax Ws,用@XMLRootElement和@XMLType注释类有什么区别。我一直在用@XMLType注释类,当结构在XML模式中使用不止一次时,用@XMLRootElement注释类,当它只使用一次时,这是最好的方法吗 一个不同但相关的问题,我将在这里包括。@XMLType注释有一个proporter属性来指定其元素的显示顺序-是否有一个与@XMLRootElement等效的属性 我将这些注释与JAX-WS注释结合使用来创建web服务,如果这有什么区别的话。XmlRootElement和XmlType

@XMLRootElement
@XMLType
注释类有什么区别。我一直在用
@XMLType
注释类,当结构在XML模式中使用不止一次时,用
@XMLRootElement
注释类,当它只使用一次时,这是最好的方法吗

一个不同但相关的问题,我将在这里包括。
@XMLType
注释有一个proporter属性来指定其元素的显示顺序-是否有一个与
@XMLRootElement
等效的属性


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

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

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

编辑:解决
proporter
问题:如果同时声明本地类型,则可以在全局元素上使用它:

@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
。您可以在不使用任何注释的情况下使用实现

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


@XmlRootElement

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

    private String name;

}
public class Bar {

    private String name;

}
<root>
    <name>Jane Doe</name>
</root>
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();
有时,JAXB实现需要仅基于正在处理的XML元素实例化对象。
@XmlRootElement
注释是指定此关联的主要方法。注意:如果一个类对应于多个XML元素,则应使用
@xmlementdecl
注释

角色#1-指定根对象

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

Foo

XML

角色#2-替代组

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

角色#3-任何内容

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


@XmlType

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

    private String name;

}
public class Bar {

    private String name;

}
<root>
    <name>Jane Doe</name>
</root>
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();
角色#1-模式生成

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

角色#2-继承和xsi:type

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

角色#3-道具顺序

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

角色#4-工厂方法

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


一个不同但相关的问题,我将在这里包括。@XMLType 注释具有一个propOrder属性,用于指定注释的顺序 元素出现-是否存在@XMLRootElement的等效项

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

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