J'ai vu de nombreuses implémentations de JAXB dans lesquelles nous pouvons convertir les primitives Java en éléments XML en utilisant l'annotation @XmlElement
.
Mais je veux convertir les POJO suivants en XML (notez qu’il existe une adresse objet dans la classe d’employés et pas seulement des primitives):
public class Employee {
private Address address;
private int employeeId;
// constructors + setters + getters
}
Comment utiliser ces annotations JAXB pour convertir un objet employé en XML?
Merci.
J'ai été capable de réaliser un regroupement XML "objet à l'intérieur de l'objet" avec JAXB en suivant l'approche indiquée ci-dessous (c'est-à-dire en annotant les deux classes avec l'annotation @XmlRootElement
):
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Employee {
@XmlElement
private Address address;
.
.
}
@XmlRootElement
public class Address {
.
.
}
Il n'y a rien de différent que vous devez faire pour marshaler une propriété POJO de ce que vous faites pour marshaler une propriété primitive. La classe POJO référencée n'a pas besoin d'être annotée avec @XmlRootElement
.
Employé
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Employee {
private Address address;
private int employeeId;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
}
Adresse
Il n'y a rien de spécial à faire pour que Address
soit organisé dans le cadre de Employee
.
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
Vous trouverez ci-dessous un code de démonstration qui remplira le modèle employé et le transmettra au format XML.
Démo
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Employee.class);
Address address = new Address();
address.setStreet("1 A Street");
Employee employee = new Employee();
employee.setEmployeeId(123);
employee.setAddress(address);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(employee, System.out);
}
}
Sortie
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
<address>
<street>1 A Street</street>
</address>
<employeeId>123</employeeId>
</employee>
Si vous souhaitez remplacer le nom d'élément par défaut, vous pouvez utiliser l'annotation @XmlElement
quel que soit le type de la propriété.
Employé
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Employee {
private Address address;
private int employeeId;
@XmlElement(name="ADDR")
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@XmlElement(name="ID")
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
}
Sortie
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
<ADDR>
<street>1 A Street</street>
</ADDR>
<ID>123</ID>
</employee>
En utilisant Jaxb, vous pouvez essayer le code suivant. Sinon, vous pouvez essayer Xstream
@XmlRootElement
public class TestObject {
String a;
TestObject1 anotherObject;
public String getA() {
return a;
}
@XmlElement
public void setA(String a) {
this.a = a;
}
public TestObject1 getAnotherObject() {
return anotherObject;
}
@XmlElement
public void setAnotherObject(TestObject1 anotherObject) {
this.anotherObject = anotherObject;
}
public static void main(String[] args) throws JAXBException {
TestObject object = new TestObject();
object.setA("A");
TestObject1 anotherObject = new TestObject1();
anotherObject.setB("B");
object.setAnotherObject(anotherObject);
File file = new File("output.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(TestObject.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(object, file);
jaxbMarshaller.marshal(object, System.out);
}
}
=========================
@XmlRootElement
public class TestObject1 {
String b;
public String getB() {
return b;
}
@XmlElement
public void setB(String b) {
this.b = b;
}
}