web-dev-qa-db-fra.com

Comment utiliser @XmlElement et @XmlRootElement pour organiser un objet dans un objet?

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.

9
Akshay Lokur

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 {
    .
    .
}
0
Akshay Lokur

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.

Modèle java

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;
    }

}

Code de démonstration

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>

Renommer l'élément guidé

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>
16
Blaise Doughan

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;
    }

}
0
Hirak