JAXB

Java Architecture for XML Binding

★サンプル

public class Company {

private List<Employee> employees;

// getter・setter

}

public class Employee {

private String name;

private int salary;

// getter・setter

}

JavaオブジェクトからXMLへの変換

Company c = new Company();

List<Employee> employees = new ArrayList<Employee>();

Employee e1 = new Employee();

...

employees.add(e1);

...

c.setEmployees(employees);

JAXB.marshal(c, System.out);

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<company>

<employees>

<name>xxx</name>

<salary>xxx</salary>

</employees>

...

</company>

XMLからJavaオブジェクトへの変換

String xml = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"

+ "<company>"

...

+ "</company>";

Company c = JAXB.unmarshal(new StringReader(xml), Company.class);

バインディング

public class Company {

private List<Employee> employees;

@XmlElementWrapper

@XmlElement(name="employee")

public List<Employee> getEmployees() {

return employees;

}

...

}

<company>

<employees>

<employee>

<name>xxx</name>

<salary>xxx</salary>

</employee>

...

</employees>

</company>

public class Employee {

private String name;

private int salary;

@XmlAttribute

public String getName() {

return name;

}

@XmlAttribute

public int getSalary() {

return salary;

}

...

}

<company>

<employees>

<employee salary="xxx" name="xxx"/>

<employee salary="xxx" name="xxx"/>

</employees>

</company>

import javax.xml.bind.annotation.XmlSeeAlso;

@XmlRootElement(name = "List")

@XmlSeeAlso(Company.class)

//@XmlSeeAlso({ A.class, B.class })

public class CompanyList {

@XmlElement(name = "companyList")

private List<Company> list;

...

}

※他サイト参照

★JPA・JAX-RSと連携

import javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlType;

import javax.xml.bind.annotation.XmlTransient;

@Entity

@Table(name = "CONTACT")

@XmlRootElement

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = { "id", "name", "email" })

@Setter @Getter

public class Contact implements Serializable {

@Id

@Column(name = "ID")

@GeneratedValue

@XmlElement

private Integer id;

@Column(name = "NAME")

@XmlElement

private String name;

@Column(name = "EMAIL")

@XmlElement

private String email;

@Version

@Column(name = "version")

@XmlTransient

private Date version;

@ManyToOne

@JoinColumn(name = "companyId")

@XmlTransient

private Company company;

@OneToOne(mappedBy = "contact", cascade = CascadeType.ALL)

@XmlTransient

private ContactDetail contactDetail;

}

@GET

@Produces("application/xml")

@Path("xml/{name}")

public Contact getXML(@PathParam("name") String name) {

return contactService.findByName(name);

}

@GET

@Produces("application/json")

@Path("json/{name}")

public Contact getJSON(@PathParam("name") String name) {

...

}