Elim的博客

用来记录一些原创性的总结


Elim

JAXB之实例回调方法

在使用JAXB进行对象和XML之间的相互转换时,如果对应的类按照JAXB的规范定义了一些回调方法,JAXB会在进行操作时调用对应的回调方法,对应的回调方法一共有四个。

需要注意的是这些方法定义必须与规定的一致:方法名必须一致;方法参数类型、个数和顺序必须一致;至于是否有抛出异常这些是不影响的。这些回调方法不需要四个都定义,可以只定义你感兴趣的回调方法。下面是一个Org类的定义,其中就定义对应的四个回调方法,

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="org")
public static class Org {
	private String no;
	private String name;
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * 方法名必须是beforeMarshal,必须只接收一个Marshaller类型的参数,至于是否抛出异常JVM是不管的
	 * @param marshaller
	 */
	public void beforeMarshal(Marshaller marshaller) {
		System.out.println("马上要marshal本对象了");
	}
	
	public void afterMarshal(Marshaller marshaller) {
		System.out.println("该对象已经被marshal了");
	}
	
	public void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) {
		System.out.println("马上要unmarshal该对象了,持有该对象的父级对象是:" + parent);
	}
	
	public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
		System.out.println("该对象已经unmarshal完成了,持有该对象的父级对象是:" + parent);
	}
	
}

进行测试如下:

@Test
public void test() throws Exception {
	
	Org org = this.buildOrg();
	JAXBContext jaxbContext = JAXBContext.newInstance(Org.class);
	Marshaller marshaller = jaxbContext.createMarshaller();
	StringWriter writer = new StringWriter();
	marshaller.marshal(org, writer);
	
	
	System.out.println("--------------分界线--------------");
	
	
	
	Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
	unmarshaller.unmarshal(new StringReader(writer.toString()));
	
}

private Org buildOrg() {
	Org org = new Org();
	org.setNo("A001");
	org.setName("XXX");
	return org;
}

输出如下:

马上要marshal本对象了
马上要marshal本对象了
该对象已经被marshal了
该对象已经被marshal了
--------------分界线--------------
马上要unmarshal该对象了,持有该对象的父级对象是:null
该对象已经unmarshal完成了,持有该对象的父级对象是:null

(注:本文由Elim写于2017年9月18日)