欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
JAXB主要通过注解进行节点标识,话不多说,接下来,直接对JAXB涉及的注解进行解释:
· @XmlRootElement: 标识XML数据根节点,常与@XmlType,@XmlAccessorType,@XmlAccessorOrder一起使用。
级别: 类。
属性:
① name: 指定根节点名称,若未指定,则使用类名小写形式作为根节点名称。
② namespace: 指定根节点命名空间。
· @XmlType: 将一个类映射到 XML 模式类型。类是通过属性和字段表示的值的数据容器。模式类型是一个数据容器,用于模式类型的内容模式中的模式组件(如模型组件、属性等)所表示的值。
级别: 类。
属性:
① name: 类映射的XML模型类型的名称。
② propOrder: 指定类型映射到XML模式复合类型时XML Schema元素的顺序。propOrder中列出的JavaBean属性或字段不得被@XmlTransient注释。propOrder定义的情况下,JavaBean中需要将所有参与属性或字段必须全部列出。
③ namespace: XML Schema类型的目标命名空间的名称,默认情况下,这是包含该类的包的映射目标命名空间。
④ factoryClass: 包含用于创建此类的实例的无参数工厂方法的类。
⑤ factoryMethod: 在factoryClass factoryClass()中指定的类中的无参工厂方法的名称。
· @XmlAccessorType: 指定属性或字段是否进行默认序列化。
级别: 类。
属性:
① value: value值对应XmlAccessType枚举,XmlAccessType包含:
1)PROPERTY:JavaBean中所有成对出现的getter/setter都将自动绑定到XML,由@XmlTransient注释的getter/setter除外。
2)FIELD:JavaBean中所有非静态、非瞬态字段都将自动绑定到XML,由@XmlTransient注释的字段除外。
3)PUBLIC_MEMBER:JavaBean中所有公共的成对出现的getter/setter和字段都将自动绑定到XML,由@XmlTransient注释的除外。
4)NONE:默认所有内容都不自动绑定到XML。
上面XmlAccessType的几个枚举值,都提到自动绑定,即在类上设置其中任一值时,并不会影响到被特定注解注释的getter/setter、属性、字段等。
· @XmlElement: 将getter/setter或非静态、非瞬态字段绑定到XML。
级别: 字段、方法、参数。
属性:
① name: XML元素名称,若未指定,则从JavaBean中取getter/setter或非静态、非瞬态字段作为默认值。
② nillable: 是否处理空参数。
③ required: 指定该元素是否必需。
④ namespace: 指定XML绑定时命名空间。
⑤ defaultValue: 指定XML绑定时默认值。
⑥ type: 指定getter/setter或非静态、非瞬态字段的关联类型。
· @XmlElementWrapper: 围绕getter/setter或非静态、非瞬态字段生成一个包装元素。
级别: 字段、方法。
属性:
① name: 指定包装元素的名称,默认从JavaBean中取默认值。
② namespace: 指定包装元素的命名空间。
③ nillable: 是否处理空参数。
④ required: 指定该元素是否必需。
· @XmlAttribute: 被@XmlAttribute注释的字段、方法,将被绑定为本类对应元素的属性。属性名取getter/setter或非静态、非瞬态字段作为默认值。
级别: 字段、方法。
属性:
① name: 属性名称,默认情况下,在不指定的情况下,默认是从JavaBean取默认值作为属性名。指定的情况下,使用name的值作为属性名。
② namespace: 指定属性名对应的命名空间。
③ required: 指定该属性是否必需。
· @XmlTransient: 被@XmlTransient注释的类、字段、方法,在进行XML绑定时将被忽略,和序列化时transient关键字作用类似。
级别: 类、字段、方法。
· JavaBean定义
此JavaBean中除@XmlTransient外,其他均在JavaBean中进行了使用,如下:
package com.arhorchin.securitit.serialize.jaxb;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* @author Securitit.
* @note JAXB演示Bean.
*/
@XmlRootElement(
name = "people",
namespace = "http://www.securitit.com")
@XmlType(
name = "peopleType",
namespace = "http://www.securitit.com",
propOrder = { "address", "name", "company", "infomation" },
factoryClass = PeopleFactory.class,
factoryMethod = "createPeople")
// @XmlAccessorType(XmlAccessType.FIELD)
public class People {
/**
* docx.
*/
private String docx;
/**
* name.
*/
private String name;
/**
* address.
*/
private String address;
/**
* company.
*/
private String company;
/**
* infomation.
*/
private List<String> infomation;
@XmlAttribute(
name = "docx",
namespace = "http://wwww.Securitit.com")
public String getDocx() {
return docx;
}
public void setDocx(String docx) {
this.docx = docx;
}
@XmlElement(
name = "defName",
required = true,
namespace = "http://www.securitit.com")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(
defaultValue = "---")
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@XmlElement(
nillable = false)
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@XmlElement(
nillable = false)
@XmlElementWrapper(
name = "infomations")
public List<String> getInfomation() {
return infomation;
}
public void setInfomation(List<String> infomation) {
this.infomation = infomation;
}
@Override
public String toString() {
return "{\"name\": \"" + name + "\", \"address\": \"" + address + "\", \"company\": \"" + company
+ "\", \"infomation\": \"" + infomation + "\"}";
}
}
在定义JavaBean时有几点需要注意:
① 使用@XmlElement注解时,需要注意属性定义与getter之间的冲突,会引起类似<有两个名为 “xxxxx” 的属性>的错误,此时我们@XmlElement标注在getter上,以避免这种问题。
② @XmlAccessorType与@XmlElement具有相似的语义,要避免相同的getter/setter、属性和字段同时拥有两者的语义。
③ @XmlElementWrapper必须应用在集合属性上,单一属性会出现异常。
④ 上面定义的JavaBean,包含了文中所涉及的注解及注解属性。
· 测试程序
演示程序依赖于《Java 序列化之JAXB完全解读》中的工具类JaxbUtil,演示程序代码如下:
package com.arhorchin.securitit.serialize.jaxb;
import java.util.ArrayList;
import java.util.List;
/**
* @author Securitit.
* @note JAXB演示测试.
*/
public class PeopleTester {
public static void main(String[] args) {
People bean = null;
List<String> infoList = null;
String xmlStr = null;
People vBean = null;
bean = new People();
bean.setDocx("demo");
bean.setName("Securitit");
bean.setAddress("China");
bean.setCompany("HHHH");
infoList = new ArrayList<String>();
infoList.add("first");
infoList.add("second");
infoList.add("third");
bean.setInfomation(infoList);
// 序列化.
xmlStr = JaxbUtil.convertToXml(bean);
System.out.println("---------------- 序列化结果 ----------------");
System.out.println(xmlStr);
vBean = JaxbUtil.convertToJavaBean(xmlStr, People.class);
System.out.println("---------------- 反序列化结果 ----------------");
System.out.println(vBean);
}
}
演示程序输出结果:
---------------- 序列化结果 ----------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:people ns1:docx="demo" xmlns:ns1="http://wwww.Securitit.com" xmlns:ns3="http://www.securitit.com">
<address>China</address>
<ns3:defName>Securitit</ns3:defName>
<company>HHHH</company>
<infomations>
<infomation>first</infomation>
<infomation>second</infomation>
<infomation>third</infomation>
</infomations>
</ns3:people>
---------------- 反序列化结果 ----------------
{"name": "Securitit", "address": "China", "company": "HHHH", "infomation": "[first, second, third]"}
总结:
· 本文针对常用的注解XmlRootElement、XmlType、XmlAccessorType、XmlElement、XmlElementWrapper、XmlAttribute、XmlTransient进行讲解和应用。
· 其他注解会在后续的文章中一一讲解,以便大家学习。
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!