JAXB(即Java Architecturefor XML Binding)是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。
该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。
下面对JAXB中的几个常用注解做一下讲解说明,抛砖引玉,有不足之处,还望指出。
1.@XmlRootElement
将一个Java类映射为一段XML的根节点(根元素),如
@XmlRootElement(name=”Root”)
public class Root{…}
映射为:1
<Root></Root>
该注解接收两个参数:
name:定义这个根节点的名称
namespace:定义这个根节点的命名空间
2.@XmlAccessorType
定义映射这个类中的何种类型需要映射到XML,该注解接收四个枚举类型的参数:
XmlAccessType.FIELD:java对象中的所有成员变量;
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量;
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量(默认);
XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素。
3.@XmlType
该注解用在class类上,定义映射的一些相关规则,该注解接收以下几个参数:
propOrder 指定映射XML时的节点顺序
factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
factoryMethod 指定工厂类的工厂方法
name 定义XML Schema中type的名称
namespace 指定Schema中的命名空间1
*注:以上三个注解常常放在一起搭配使用。
4.@XmlElement
指定一个字段或get/set方法映射到XML的节点。当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。如
@XmlRootElement(name=”Root”)
public class Root{
@XmlElement(name = “rootChild”)
private String child;
…}映射为:1
<Root><rootChild></rootChild></Root>
该注解接收以下几个参数:
defaultValue 指定节点默认值
name 指定节点名称
namespace 指定节点命名空间
required 是否必须(默认为false)
nillable 该字段是否包含 nillable=”true” 属性(默认为false)
type 定义该字段或属性的关联类型
5.@XmlAttribute
指定一个字段或get/set方法映射到XML的属性。如
@XmlRootElement(name=”Root”)
public class Root{
@XmlAttribute(name = “rootChild”)
private String child;
…}映射为:1
<Root rootChild=""></Root>
该注解接收以下几个参数:
name 指定属性名称
namespace 指定属性命名空间
required 是否必须(默认为false)
6.@XmlTransient
定义某一字段或属性不需要被映射为XML。如
当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射,在生成的xml文件中不出现此元素。
7.@XmlRegistry
该注解用于注册ObjectFactory工厂类,工厂类中定义了需要映射到XML文件的javaBean,如
@XmlRegistry
public class ObjectFactory
{
public ObjectFactory(){
}
public Action createAction(){
return new Action();
}
public Rule createRule(){
return new Rule();
}
}
那么Action与Rule两个实体类在映射到XML时,可避免发生此类异常:
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:””, local:”rule”). Expected elements…
切记,在发生上述异常时,看看@XmlRegistry注解的ObjectFactory中是否有需要映射的实体类没有被注册进去。
8.@XmlSeeAlso
继承关系在ORM中已经处理得非常完善了,JAXB处理继承关系更加简单,只需要在继承树的根类上增加@XmlSeeAlso标注,声明所有的子类即可。 比如我们定义了一个User的子类:
public class MyUser extends User {…}
则只需要在User类上面增加标注:
@XmlSeeAlso({
MyUser.class
})
public class User {…}