When you use polymorphism in your classes and you want to convert your object to XML using JAX-B, here is an example how to.
Abstract Animal Class
package com.sheting.basic.xml.jaxb;
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlSeeAlso({ Dog.class, Cat.class })
public class Animal {
}
Cat Inherits from Animal
package com.sheting.basic.xml.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "cat")
public class Cat extends Animal {
private String catPro;
public String getCatPro() {
return catPro;
}
public void setCatPro(String catPro) {
this.catPro = catPro;
}
}
Dog Inherits from Animal
package com.sheting.basic.xml.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "dog")
public class Dog extends Animal {
private String dogPro;
public String getDogPro() {
return dogPro;
}
public void setDogPro(String dogPro) {
this.dogPro = dogPro;
}
}
Root entity class for converting list of animals
package com.sheting.basic.xml.jaxb;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "root")
public class Root {
private List<Animal> animals;
public List<Animal> getAnimals() {
return animals;
}
@XmlElementWrapper(name = "animals")
@XmlElements({ @XmlElement(name = "dog", type = Dog.class), @XmlElement(name = "cat", type = Cat.class) })
public void setAnimals(List<Animal> animals) {
this.animals = animals;
}
}
Convert Polymorphic Object to XML
package com.sheting.basic.xml.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class PolymorphismObjectXml {
public static void main(String... args) throws JAXBException {
// create object
List<Animal> animals = new ArrayList<Animal>();
animals.add(new Dog());
animals.add(new Cat());
Root root = new Root();
root.setAnimals(animals);
// create jaxb context
JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
// create jaxb marshaller
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// pretty print xml
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// marshal object
jaxbMarshaller.marshal(root, System.out);
}
}
Output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<animals>
<dog/>
<cat/>
</animals>
</root>
question: 为什么子类的属性没有显示? 有时间再研究