首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@XMLRootElement与@XmlType

@XMLRootElement与@XmlType
EN

Stack Overflow用户
提问于 2012-07-17 18:35:23
回答 2查看 52.2K关注 0票数 41

@XMLRootElement@XMLType注释一个类有什么区别。当结构在XML schema中多次使用时,我一直使用@XMLType注释类;当结构只使用一次时,我使用@XMLRootElement注释类-这是最好的方法吗?

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

我将结合使用这些注释和JAX-WS注释来创建web服务,如果这样做会有所不同的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 21:59:35

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

代码语言:javascript
复制
<xs:element name=foo type="bar"> </xs:element> <-- schema type

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

代码语言:javascript
复制
<xs:complexType name=bar> </xs:complexType> <-- complex type

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

XmlRootElement

XmlType

编辑:解决propOrder问题:如果还声明局部类型,则可以在全局元素上使用它:

代码语言:javascript
复制
@XmlRootElement (name="PersonElement")
@XmlType (propOrder={"firstname", "lastname"})
public class People{
    @XmlElement
    public String firstname;
    public String lastname;
}

这将产生类似如下的结果:

代码语言:javascript
复制
<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>
票数 22
EN

Stack Overflow用户

发布于 2012-07-17 23:57:29

当结构在

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

要知道的一件事是,@XmlRootElement@XmlType注释都不是必需的。它们不是来自JPA的@Entity的等价物。您可以使用不带任何注释的实现:

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

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

@XmlRootElement

有时,您的JAXB实现只需要根据正在处理的XML元素实例化一个对象。@XmlRootElement注释是指定此关联的主要方法。注意:如果一个类对应于一个以上的XML元素,那么应该使用@XmlElementDecl注释,

角色#1 -指定根对象

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

Foo

代码语言:javascript
复制
@XmlRootElement(name="root")
public class Foo {

    private String name;

}

代码语言:javascript
复制
public class Bar {

    private String name;

}

XML

代码语言:javascript
复制
<root>
    <name>Jane Doe</name>
</root>

演示

代码语言:javascript
复制
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

角色#3 -任何内容

@XmlAnyElement允许您映射文档的通配符部分。如果指定@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

角色#3 -属性订单

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

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

角色#4 -工厂方法

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

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

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

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

代码语言:javascript
复制
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
    ...
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11520724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档