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) {
...
}