Java HTML / XML How to - Use JAXB inheritance + element rename








Question

We would like to know how to use JAXB inheritance + element rename.

Answer

//  w  ww .  ja v  a  2 s. co m
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

public class Main {

  public static void main(String[] args) throws Exception {
    JAXBContext jc = JAXBContext.newInstance(BarX.class, BarY.class);
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    BarX barX = new BarX();
    barX.setXThing("XThing");
    marshaller.marshal(barX, System.out);

    BarY barY = new BarY();
    barY.setYBlah("YBlah");
    marshaller.marshal(barY, System.out);
  }

  @XmlRootElement
  @XmlType(propOrder = { "YBlah" })
  public static class BarY extends Foo {

    @XmlElement(name = "blah")
    public String getYBlah() {
      return name;
    }

    public void setYBlah(String blah) {
      name = blah;
    }

  }

  @XmlTransient
  public static abstract class Foo {
    protected String name;
  }

  @XmlRootElement
  @XmlType(propOrder = { "XThing" })
  public static class BarX extends Foo {

    @XmlElement(name = "thing")
    public String getXThing() {
      return name;
    }

    public void setXThing(String thing) {
      name = thing;
    }

  }
}