JAXB 注解元素说明

@XmlRootElement

@XmlRootElement 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中会以一个全局元素的形式出现,元素的类型是一个包含 Java 类属性的 XML 复杂数据类型。我们可以通过 @XmlRootElement 注解的 name 属性来定制映射的 schema 全局元素的名称,一般来说以 @XmlRootElement 标注的类在相应的 XML 文档中会以最外层或根节点形式出现。比方说有如下标注类:

@XmlRootElement(name="RootStudent",namespace="http://service.dsw.ibm.com/")
public class Student {
...
}
这个 Java 类在映射后的 Web 服务 schema 中会表现为:
<xs:element name="RootStudent" type="tns:student"/>
<xs:complexType name="student">
<xs:sequence>
  <xs:element name="id" type="xs:int"/>
  <xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>

@XmlType

@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现。我们可以通过 @XmlType 注解的 name 属性来定制映射的 XML 数据类型的名称,用 propOrder 属性来定制映射后的复杂数据类型的内容顺序等。比方说有如下标注类:

@XmlType(name = "CustomizedStudent", propOrder = { "name", "id", "age" })
public class Student {
private int id;
private int age;
private String name;
....
}

 

这个 Java 类在映射后的 Web 服务 schema 中会表现为:

<xs:complexType name="CustomizedStudent">
<xs:sequence>
  <xs:element name="name" type="xs:string"/>
  <xs:element name="id" type="xs:int"/>
  <xs:element name="age" type="xs:int"/>
</xs:sequence>
</xs:complexType>

@XmlElement

@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。比方说有如下标注类:

nillable="true":该元素的值可以为空,但是该元素不能省略:

minOccurs="0":该元素可以直接被省略掉,但是不能让该元素的值为空

@XmlType(name = "CustomizedStudent", propOrder = { "name", "id", "age"})
public class Student {
	 @XmlElement(name="StudentID",required=true)  
	 private int id;
	 @XmlElement(name="StudentAge",nillable=true) 	
	 private int age;
	 @XmlElement(name="StudentName") 	
	 private String name;
}

 

这个 Java 类在映射后的 Web 服务 schema 中会表现为:

<xs:complexType name="CustomizedStudent">
<xs:sequence>
  <xs:element minOccurs="0" name="StudentName" type="xs:string"/>
  <xs:element name="StudentID" type="xs:int"/>
  <xs:element name="StudentAge" nillable="true" type="xs:int"/>
</xs:sequence>
</xs:complexType>

@XmlAttribute

@XmlAttribute 注解用于标注 Javabean 属性,用它标注的属性在映射后的 schema 中以元素属性形式表现。我们可以通过 @XmlAttribute 注解的 name 属性来定制映射后的名称,用 required 属性来指定是否映射后的属性为必须出现的。比方说有如下标注类:

@XmlType(name = "CustomizedStudent", propOrder={"name","id","age"})
public class Student {
	 @XmlElement(name="StudentID")
	 private int id;
	 @XmlAttribute(name="StudentAge") 	
	 private int age;
	 @XmlAttribute(name="StudentName",required=true) 	
	 private String name;
}

 

这个 Java 类在映射后的 Web 服务 schema 中会表现为:

<xs:complexType name="CustomizedStudent">
<xs:sequence>
  <xs:element name="StudentID" type="xs:int"/>
</xs:sequence>
<xs:attribute name="StudentName" type="xs:string" use="required"/>
<xs:attribute name="StudentAge" type="xs:int" use="required"/>
</xs:complexType>

 

@XmlAccessorType

@XmlTransient

@XmlJavaTypeAdaptor

 

 @XmlSeeAlso

   我们的 XSD 使用了一个有意思的 XML 模式特性 —— 继承.文章 Polymorphic Web services 详细介绍了这个特性,解释了 XML 扩展和动态服务调用技术如何提供多态性.我们在 JAXB 的上下文中考虑一下图 10 所示的模式.

 

 

 

 

 

   

 

 

 

BaseNotification 分别派生出 TaxNotification 和 PaymentNotification。它们继承基类型的所有属性和元素,并添加自己的新属性,见清单 8

  1. <xsd:complexType abstract="true" name="BaseNotification">  
  2.         …  
  3. </xsd:complexType>  
  4.       
  5. <xsd:complexType name="TaxNotification">  
  6.   <xsd:complexContent>  
  7.     <xsd:extension base="bo:BaseNotification">  
  8.     </xsd:extension>  
  9.   </xsd:complexContent>  
  10. </xsd:complexType>  
  11.   
  12. <xsd:complexType name="PaymentNotification">  
  13.   <xsd:complexContent>  
  14.     <xsd:extension base="bo:BaseNotification">  
  15.  

 JAXB 运行时通过内省注册所需的所有 Java 类.现在,如果在运行时作为基类型传递派生的子类,那么无法通过检查接口参数类型识别出子类.

为了利用继承和多态性,在 JAXB 2.1 和 Java 6.0 中引入了一个新注解 javax.xml.bind.annotation.XmlSeeAlso.@XmlSeeAlso 通过引用在 JAXBContext 中添加的额外派生子类类以及根据接口参数识别出的类实现多态性,见清单 9.

 收藏代码

  1. @XmlSeeAlso({  
  2.     PaymentNotification.class,  
  3.     TaxNotification.class  
  4. })  
  5. public   abstract   class BaseNotification {  
  6.   
  7. ...  
  8.   
  9. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值