Java HTML / XML How to - Deal with Duplicated field in generated XML using JAXB








Question

We would like to know how to deal with Duplicated field in generated XML using JAXB.

Answer

/*from  ww w. ja  v  a2s  .  c o m*/
import java.util.ArrayList;
import java.util.List;

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;

public class Main {
  public static void main(String[] args) throws Exception {
    JAXBContext jc = JAXBContext.newInstance(Parent.class, IntegerChild.class,
        StringChild.class);

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    IntegerChild integerChild = new IntegerChild();
    integerChild.getItem().add(1);
    integerChild.getItem().add(2);
    marshaller.marshal(integerChild, System.out);

    StringChild stringChild = new StringChild();
    stringChild.getItem().add("A");
    stringChild.getItem().add("B");
    marshaller.marshal(stringChild, System.out);
  }

  @XmlRootElement
  public static class Parent<T> {

    private List<T> item = new ArrayList<T>();

    @XmlTransient
    public List<T> getItem() {
      return item;
    }

    public void setItem(List<T> item) {
      this.item = item;
    }

  }

  @XmlRootElement
  public static class StringChild extends Parent<String> {

    @Override
    @XmlElement
    public List<String> getItem() {
      return super.getItem();
    }

    @Override
    public void setItem(List<String> item) {
      super.setItem(item);
    }

  }

  @XmlRootElement
  public static class IntegerChild extends Parent<Integer> {

    @Override
    @XmlElement
    public List<Integer> getItem() {
      return super.getItem();
    }

    @Override
    public void setItem(List<Integer> item) {
      super.setItem(item);
    }

  }
}