Jaxb2实现JavaBean与xml互转

说明

JAXB(Java Architecture for XML Binding)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档

  1. @XmlRootElement 用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称
  2. @XmlAccessorType定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)
      XmlAccessType.FIELD: java对象中的所有成员变量。
      XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量。
      XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。
      XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素
  3. @XmlAttribute 用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名
  4. @XmlElement 指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称
  5. @XmlJavaTypeAdapter 使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
  6. Marshaller接口,将Java对象序列化为XML数据
  7. Unmarshaller接口,将XML数据反序列化为Java对象
流程
  1. 创建xml对应的实体类
  2. 日期类型处理@XmlJavaTypeAdapter
代码

xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ZhbitEventResult xmlns="http://com.zhbit.schema/EventMessage.xsd">
    <Event>
        <studentNumber>170202041011</vesseGID>
        <ServiceType>zhbit</ServiceType>
        <ChineseName>张三</ChineseName>
    </Event>
    <Event>
        <studentNumber>170202041012</vesseGID>
        <ServiceType>zhbit</ServiceType>
        <ChineseName>李四</ChineseName>
    </Event>
    <updateTimeUTC>2020-07-03 07:30:00</updateTimeUTC>
  </ZhbitEventResult>

xml实体类映射

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.Data;

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ZhbitEventResult")
public class ZhbitEventResult implements Serializable {

	private static final long serialVersionUID = 1L;

	@XmlElement(name = "Event")
	private List<Event> events;

	@XmlElement(name = "updateTimeUTC")
	@XmlJavaTypeAdapter(JaxbDateSerializer.class)
	private Date updateTimeUTC;
}
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.Data;

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Event")
public class Event implements Serializable {

	private static final long serialVersionUID = 1L;

	@XmlElement(name = "studentNumber")
	private String studentNumber;

	@XmlElement(name = "ServiceType")
	private String serviceType;

	@XmlElement(name = "ChineseName")
	private String ChineseName;
}

日期格式处理: xml是文本类型数据,时间类型的数据在xml中只是字符串, 转成Bean的过程中,需要自定义适配器, 若只想保持字符串格式,可省略此步

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
/**

*/
public class JaxbDateSerializer extends XmlAdapter<String, Date> {

	private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

	private static class SingletonDateFormat {
		private static final SimpleDateFormat instance = new SimpleDateFormat(DATE_FORMAT);
	}

	public static SimpleDateFormat getSimpleDateFormat() {
		return SingletonDateFormat.instance;
	}

	@Override
	public Date unmarshal(String v) throws Exception {
		SimpleDateFormat format = getSimpleDateFormat();
		return format.parse(v);
	}

	@Override
	public String marshal(Date v) throws Exception {
		SimpleDateFormat format = getSimpleDateFormat();
		return format.format(v);
	}
}

xml文本转JavaBean工具类

public static<T> T xml2bean(String xml, Class<T> beanClazz) {
		T t = null;
		try {
			JAXBContext context = JAXBContext.newInstance(beanClazz);
			Unmarshaller unmarshaller = context.createUnmarshaller();

			StringReader reader = new StringReader(xml);
			SAXParserFactory sax = SAXParserFactory.newInstance();
			sax.setNamespaceAware(false); // 忽略命名空间

			XMLReader xmlReader = sax.newSAXParser().getXMLReader();
			Source source = new SAXSource(xmlReader, new InputSource(reader));

			t = (T) unmarshaller.unmarshal(source);
		} catch (Exception e) {
			logger.error(ExceptionTool.getTrace(e));
		}
		return t;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值