@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。这使得映射到表示继承的替换组的概念成为可能
@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
注释中指定的名称和命名空间,或者是基于类的默认值
@XmlType
指定属性顺序
@XmlType
允许您指定可用于实例化域对象而不是默认构造函数的工厂类和/或方法
一个不同但相关的问题,我将在这里包括。@XMLType 注释具有一个propOrder属性,用于指定注释的顺序 元素出现-是否存在@XMLRootElement的等效项 否,
proporter
方面属于@XmlType
注释。这是有意义的,因为复杂类型负责指定(或缺少)顺序。当然,您可以同时使用这些注释
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}