前面一章简单演示了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
继续阅读与本文标签相同的文章
使用JAXB解析xml文件(一)
使用jquery.qrcode.js生成二维码
-
SpringBoot学习之集成mybatis
2026-06-02栏目: 教程
-
使用WebStorm进行javascript调试
2026-06-02栏目: 教程
-
浅谈MySQL中优化sql语句查询常用的30种方法
2026-06-02栏目: 教程
-
lombok安装与简易教程(一)
2026-06-02栏目: 教程
-
CentOS 7 安装MySQL 5.6遇到问题及解决方案
2026-06-02栏目: 教程
