Další anotace v JAXB

V jednom z předchozích příspěvků jsem se věnoval základní práci s JAXB, kde jsem používal pouze dvě anotace a to @XmlRootElement a @XmlType. Podívejme se na část vytvořeného xml souboru.

<company>
    <centers>
        <code>METPRG</code>
        <description>Office center Metronom in Prague</description>
        <rooms>
            <code>A02</code>
            <numberOfSeats>14</numberOfSeats>
        </rooms>
        <rooms>
            <code>A13</code>
            <numberOfSeats>42</numberOfSeats>
        </rooms>
        <rooms>
            <code>B08</code>
            <numberOfSeats>22</numberOfSeats>
        </rooms>
    </centers>
    <centers>
        <code>AVIPRG</code>
        <description>Office center Aviatica in Prague</description>
        <rooms>
            <code>AA41</code>
            <numberOfSeats>70</numberOfSeats>
        </rooms>
        <rooms>
            <code>CA12</code>
            <numberOfSeats>38</numberOfSeats>
        </rooms>
        ...

Company obsahuje seznam elementů center a ty v sobě mají seznam elementů room. Když se podíváte pečlivěji, uvidíte, že každý element center se jmenuje centers a každý element room se jmenuje rooms. Určitě by to lépe vypadalo, kdyby se tyto elementy jmenovaly center a room. Nebo možná ještě lépe, kdyby se element center jmenoval jednoznačněji business_center. Jak center tak room obsahují element code. Bylo čitelnější, kdyby se jmenovaly center_code a room_code. A také kořenový element company by mohl obsahovat ještě atribut s názvem společnosti. To vše je možné, když použijeme další anotace, které JAXB nabízí.

Anotace @XmlAccessorType říká, že každý field (nestatická a netransientní proměnná – to jsou v tomto příkladu všechny) bude svázán s xml elementem.
Anotaci @XmlElementWrapper použijeme, když pracujeme se seznamem. Vytvoříme element, který bude v sobě obsahovat jednotlivé elementy seznamu.
Anotace @XmlAttribute nevytvoří xml element, ale atribut. Pomocí hodnoty, kterou přiřadíme do name nastavíme atributu název.
Když použijeme anotaci @XmlElement, můžeme předat hodnotu name a tím nastavíme názvem xml elementu.

Jasnější to bude na příkladu.

Číst dál

JAXB jednoduše

JAXB (Java Architecture for XML Bindings) je Java standard, který určuje, jak mají být Java objekty převedeny do a z xml. JAXB představuje rozhraní pro čtení a zápis Java objektů do a z xml. Pro zápis Java objektů do xml se používá metoda marshall() a pro načtění z xml do Java objektů metoda unmarshall(). JAXB používá anotace pro mapování Java objektů na xml elementy a zpět. Dvě nejpoužívanější anotace jsou @XmlRootElement (xml dokument musí mít root element a tato anotace označuje třídu, která v xml bude představovat root element) a @XmlType (označuje xml element).

V příkladu si ukážeme fiktivní firmu (Company), která pronajímá kanceláře (Room) v různých office centrech (Center).

Nejdříve si vytvoříme třídu Room, která bude představovat místnost v office centru k pronájmu. Zároveň tuto třídu namapujeme na element room. Namapováním je myšleno to, že řekneme, že naše třída má být v xml dokumentu reprezentována elementem room. To provedem tak, že ji označíme anotací @XmlType.

Room.java

import javax.xml.bind.annotation.XmlType;

@XmlType
public class Room {

	private String code;
	private int numberOfSeats;
	
	// musí mít defaultní konstruktor
	public Room() {}
	
	public Room(String code, int numberOfSeats) {
		this.code = code;
		this.numberOfSeats = numberOfSeats;
	}

	public String getCode() {
		return code;
	}
	
	public void setCode(String code) {
		this.code = code;
	}

	public int getNumberOfSeats() {
		return numberOfSeats;
	}

	public void setNumberOfSeats(int numberOfSeats) {
		this.numberOfSeats = numberOfSeats;
	}
}

Všimněte si, že třída Room má dva konstruktory. Proto, aby JAXB fungovalo, je nutné, aby objekty mapované na elementy měly bezparametrický konstruktor.

Číst dál