什么是注释与类之间的差别@XMLRootElement
和@XMLType
。 我一直在注释类与@XMLType
当结构将XML架构内,并与被使用一次以上@XMLRootElement
时将只使用一次-这是最好的方法?
一个不同但相关的问题,我会在这里包括。 该@XMLType
标注有propOrder属性来指定其中责令其元素出现-是有同等@XMLRootElement
?
我使用的是与JAX-WS注解结合这些注释来创建Web服务,如果有什么差别。
什么是注释与类之间的差别@XMLRootElement
和@XMLType
。 我一直在注释类与@XMLType
当结构将XML架构内,并与被使用一次以上@XMLRootElement
时将只使用一次-这是最好的方法?
一个不同但相关的问题,我会在这里包括。 该@XMLType
标注有propOrder属性来指定其中责令其元素出现-是有同等@XMLRootElement
?
我使用的是与JAX-WS注解结合这些注释来创建Web服务,如果有什么差别。
之间的区别XmlRootElement
和XmlType
是作用域的问题。 请记住这个注释仅仅是发号施令用于生成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>
我一直在注释类与@XMLType当结构将XML架构内,并与@XmlRootElement被多次使用时将只使用一次 - 这是最好的方法?
有一点需要知道的是,无论是@XmlRootElement
或@XmlType
注释是必需的。 他们不是相当于@Entity
从JPA。 您可以使用JAXB(JSR-222) ,没有任何注解什么那么执行:
下面我将解释什么@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的类型。 这使得映射取代基团的用于表示继承的概念。
ROLE#3 -任何内容
@XmlAnyElement
允许你映射你的XML文档的外卡部分。 如果指定@XmlAnyElement(lax=true)
,然后用域对象相关联的元素将被转化为相应的域对象。
@XmlType
角色#1 -架构根
默认情况下,已知的JAXB上下文中的每个Java类中生成一个名为复杂类型。 您可以使用控制这种类型的名称@XmlType
注释,或指定一个匿名复杂类型应通过指定名称生成""
。
角色#2 -继承和XSI:类型
默认情况下,JAXB充分利用了xsi:type
属性为继承指标。 此属性的值对应于您对指定的名称和命名空间@XmlType
注释,或基于类的默认。
ROLE#3 -道具订单
至于你提到你可以使用@XmlType
指定属性顺序。
ROLE#4 -工厂方法
@XmlType
允许指定可用于实例化域对象,而不是默认构造一个工厂类和/或方法。
一个不同但相关的问题,我会在这里包括。 该@XMLType标注有propOrder属性来指定在订购它的元素出现 - 是有@XmlRootElement等效?
不, propOrder
方面属于@XmlType
注解。 这是有意义的,因为复杂类型是负责指定(或缺乏)的顺序。 当然,你可以在同一时间使用这些批注。
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}