前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解

1.@ RootElement

  用于类级别的注解,对应 的跟元素,常与 @ Type 和 @ AccessorType一起使用,主要的作用是映射 的根节点

2.@ Element
 将Java对象的属性映射为 的节点,在使用@ Element时,可通过name属性改变java对象属性在 中显示的名称。

   

@ Element(name="class")private String clz;

3.@ Elements

 当节点下面包含多个相同的子节点时,该注解可以映射成一个JavaBean的集合属性,其中注解中value的属性对应的是一个@ Element的集合

1 @ Elements(value = {@ Element(name = "select", type = Select.class)})2 private List<Select> selects;

4.@ Attribute
 用于把java对象的属性映射为 的属性,并可通过name属性为生成的 属性指定别名

@ Attribute(name = "id")private String id;

5.@ AccessorType
 用于指定由java对象生成 文件时对java对象属性的访问方式。常与@ RootElement、@ Type一起使用。它的属性值是 AccessType的4个枚举值,分别为:

  • AccessType.FIELD:java对象中的所有成员变量
  • AccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
  • AccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
  • AccessType.NONE:java对象的所有属性都不映射为 的元素

  注意:@ AccessorType的默认访问级别是 AccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@ Element和@ Attribute注解,否则在由java对象生成 时会报同一个属性在java类里存在两次的错误。同理,如果@ AccessorType的访问权限为 AccessType.NONE,如果在java的成员变量上使用了@ Element或@ Attribute注解,这些成员变量依然可以映射到 文件。

  注意:虽然@ AccessorType为 AccessType.NONE,但是在java类的私有属性上加了@ Attribute和@ Element注解后,这些私有成员会映射生成 的元素

 

6.@ AccessorOrder
 用于对java对象生成的 元素进行排序。它有两个属性值:
 AccessorOrder.ALPHABETICAL:对生成的 元素按字母书序排序
  AccessOrder.UNDEFINED:不排序

7.@ Transient
 用于标示在由java对象映射 时,忽略此属性。即,在生成的 文件中不出现此元素。

8.@ JavaTypeAdapter
 常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承 Adapter抽象类,并实现里面的方法。

       

package org.lyrk.accp8.s2.chapter. ;import javax. .bind.annotation.adapters. Adapter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/** * 时间格式的转化器 * Created by niechen on 17/5/9. */public class Date Adapter extends  Adapter<String,Date> {    private static final  DateFormat DATE_FORMAT =new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");    @Override    public Date unmarshal(String v) throws Exception {        return DATE_FORMAT.parse(v);    }    @Override    public String marshal(Date v) throws Exception {        return DATE_FORMAT.format(v);    }}

9.示例代码

9.1 扩展Bean类

package org.lyrk.accp8.s2.chapter. ;import javax. .bind.annotation.*;import javax. .bind.annotation.adapters. JavaTypeAdapter;import java.util.Date;import java.util.List;/** * Created by niechen on 17/5/9. */@ RootElement@ AccessorType( AccessType.FIELD)@ AccessorOrder(value =  AccessOrder.ALPHABETICAL)public class Bean {    @ Attribute(name = "id")    private String id;//对应 文件的id属性    @ Attribute(name = "class")    private String clz;//对应 文件的class属性    @ JavaTypeAdapter(value = Date Adapter.class)//配置转换器    @ Element    private Date date;//对应 Date节点    @ Elements({@ Element(name = "property", type = Property.class)})    private List<Property> properties;//获取 中所有property节点    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public List<Property> getProperties() {        return properties;    }    public void setProperties(List<Property> properties) {        this.properties = properties;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getClz() {        return clz;    }    public void setClz(String clz) {        this.clz = clz;    }}@ AccessorType(value =  AccessType.FIELD)class Property {    @ Attribute(name = "id")    private String id;    @ Attribute(name = "value")    private String value;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value;    }}

9.2 beans. 文件

<?  version="1.0" encoding="UTF-8"?><!-- bean的解析示例 --><bean id="student" class="org.test.entity.Student">    <property id="name" value="张三"/>    <property id="age" value="18"/>    <date>2017-05-08 11:22:33</date></bean>

9.3 主函数入口

 1 package org.lyrk.accp8.s2.chapter. ; 2  3 import javax. .bind.JAXBContext; 4 import javax. .bind.JAXBException; 5 import javax. .bind.Unmarshaller; 6 import java.io.InputStream; 7  8 /** 9  * Created by niechen on 17/5/9.10  */11 public class Test {12 13     public static void main(String[] args) {14         try {15             JAXBContext jaxbContext = JAXBContext.newInstance(Bean.class);//创建JAXBContext对象,注意一定要传@ RootElement的所标记的类的类型16             Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();//拿到 解析对象17             InputStream inputStream = Bean.class.getClassLoader().getResourceAsStream("bean. ");//在classpath下读取 的文件流18             Bean bean = (Bean) unmarshaller.unmarshal(inputStream);//将 转换成实体对象19             System.out.println("id:" + bean.getId());20             System.out.println("class:" + bean.getClz());21             System.out.println("date:"+bean.getDate().getTime());22             for (Property property : bean.getProperties()) {23                 System.out.println("property id属性:" + property.getId() + "property value属性:" + property.getValue());24             }25         } catch (JAXBException e) {26             e.printStackTrace();27         }28     }29 }30 输出结果:31 id:student32 class:org.test.entity.Student33 date:148384575300034 property id属性:nameproperty value属性:张三35 property id属性:ageproperty value属性:18

 

收藏 打印