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álDalší anotace v JAXB

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álJAXB jednoduše