用来记录一些原创性的总结
在使用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日)