Java HTML / XML How to - Use @XmlIDREF and @XmlList in JAXB to represent Object List








Question

We would like to know how to use @XmlIDREF and @XmlList in JAXB to represent Object List.

Answer

//w w w .ja  v  a2s  .com
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlRootElement;

public class Main {

  public static void main(String[] args) throws Exception {
    Company company = new Company();

    Employee employee1 = new Employee();
    employee1.setId("1");
    employee1.setName("Jane Doe");
    company.getEmployees().add(employee1);

    Employee employee2 = new Employee();
    employee2.setId("2");
    employee2.setName("John Smith");
    employee2.setManager(employee1);
    employee1.getReports().add(employee2);
    company.getEmployees().add(employee2);

    Employee employee3 = new Employee();
    employee3.setId("3");
    employee3.setName("Anne Jones");
    employee3.setManager(employee1);
    employee1.getReports().add(employee3);
    company.getEmployees().add(employee3);

    JAXBContext jc = JAXBContext.newInstance(Company.class);

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(company, System.out);
  }

}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Company {

  @XmlElement(name = "employee")
  private List<Employee> employees;

  public Company() {
    employees = new ArrayList<Employee>();
  }

  public List<Employee> getEmployees() {
    return employees;
  }

  public void setEmployees(List<Employee> employees) {
    this.employees = employees;
  }

}

@XmlAccessorType(XmlAccessType.FIELD)
class Employee {

  @XmlAttribute
  @XmlID
  private String id;

  @XmlAttribute
  private String name;

  @XmlIDREF
  private Employee manager;

  @XmlIDREF
  @XmlList
  private List<Employee> reports;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Employee getManager() {
    return manager;
  }

  public void setManager(Employee manager) {
    this.manager = manager;
  }

  public List<Employee> getReports() {
    return reports;
  }

  public void setReports(List<Employee> reports) {
    this.reports = reports;
  }

  public Employee() {
    reports = new ArrayList<Employee>();
  }

}