@XmlRootElement与@XmlType(@XMLRootElement versus @X

2019-06-26 08:11发布

什么是注释与类之间的差别@XMLRootElement@XMLType 。 我一直在注释类与@XMLType当结构将XML架构内,并与被使用一次以上@XMLRootElement时将只使用一次-这是最好的方法?

一个不同但相关的问题,我会在这里包括。 该@XMLType标注有propOrder属性来指定其中责令其元素出现-是有同等@XMLRootElement

我使用的是与JAX-WS注解结合这些注释来创建Web服务,如果有什么差别。

Answer 1:

之间的区别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>


Answer 2:

我一直在注释类与@XMLType当结构将XML架构内,并与@XmlRootElement被多次使用时将只使用一次 - 这是最好的方法?

有一点需要知道的是,无论是@XmlRootElement@XmlType注释是必需的。 他们不是相当于@Entity从JPA。 您可以使用JAXB(JSR-222) ,没有任何注解什么那么执行:

  • http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

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


@XmlRootElement

有些时候,你的JAXB实现需要基于实例只被处理的XML元素的对象。 的@XmlRootElement注释是指定此关联的主要手段。 注意如果一个类对应于多于一个的XML元素,则@XmlElementDecl注释应insteat使用

角色#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的类型。 这使得映射取代基团的用于表示继承的概念。

  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html

ROLE#3 -任何内容

@XmlAnyElement允许你映射你的XML文档的外卡部分。 如果指定@XmlAnyElement(lax=true) ,然后用域对象相关联的元素将被转化为相应的域对象。

  • http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html

@XmlType

角色#1 -架构根

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

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

默认情况下,JAXB充分利用了xsi:type属性为继承指标。 此属性的值对应于您对指定的名称和命名空间@XmlType注释,或基于类的默认。

  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html

ROLE#3 -道具订单

至于你提到你可以使用@XmlType指定属性顺序。

  • http://blog.bdoughan.com/2012/02/jaxbs-xmltype-and-proporder.html

ROLE#4 -工厂方法

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

  • http://blog.bdoughan.com/2011/06/jaxb-and-factory-methods.html

一个不同但相关的问题,我会在这里包括。 该@XMLType标注有propOrder属性来指定在订购它的元素出现 - 是有@XmlRootElement等效?

不, propOrder方面属于@XmlType注解。 这是有意义的,因为复杂类型是负责指定(或缺乏)的顺序。 当然,你可以在同一时间使用这些批注。

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


文章来源: @XMLRootElement versus @XmlType
标签: xml jaxb jax-ws