Anotácie nástroja JAXB

Ciele
  1. Oboznámiť sa s anotáciami nástroja JAXB a ich využitím.
  2. Oboznámiť sa so spôsobom konfigurácie projektu pre použitie nástroja JAXB.
Úvod
    Tento modul bližšie opisuje anotácie a konfiguráciu nástroja JAXB.
Postup
  1. Vybrané anotačné typy JAXB a ich použitie v jazyku pre definovanie používateľského rozhrania.
    • @XmlRootElement anotácia označuje triedu, ktorá predstavuje koreňový element XML dokumentu. Má dva nepovinné parametre name (meno XML elementu, implicitne sa použije meno triedy) a namespace.
      
      @XmlRootElement(namespace = "http://kpi.fei.tuke.sk/magsa")
      public class UI {
          ...
      
    • @XmlElement anotácia označuje členskú premennú (resp. get/set metódu), ktorej hodnota má predstavovať obsah XML elementu.
      
      @XmlElement(name = "form")
      public Form[] getForms() {
          return forms;
      }
      
      V prípade, že chceme použiť viacero anotácií @XmlElement na jednu členskú prememnú, je možné ich zaobaliť anotáciou @XmlElements. Tá sa používa v prípade členskej premennej, ktorá predstavuje kolekciu. V takomto prípade parameter type určuje, ktorý typ komponentov kolekcie sa zobrazuje na aký element.
      
      @XmlElements({
          @XmlElement(name = "field", type = Field.class),
          @XmlElement(name = "lookupField", type = LookupField.class)
      })
      public Field[] getFields() {
          return (Field[]) getComponents();
      }
      
    • @XmlAttribute anotácia označuje členskú premennú (resp. get/set metódu), ktorej hodnota má predstavovať hodnotu atribútu XML elementu, v kontexte ktorého sa daná premenná nachádza.
      
      @XmlAttribute(name="property", required = true)
      public String getPropertyName() {
          return propertyName;
      }
      
    • @XmlTransient anotácia označuje triedu, členskú premennú alebo metódu, ktorej zobrazenie do XML dokumentu má byť potlačené. Takto označený jazykový element nebude mať svoju priamu reprezentáciu v XML dokumente.
      
      @XmlTransient
      public abstract class Component {
          ...
      }
      
      Poznámka: V tomto príklade chceme zo spracovania vylúčiť abstraktnú triedu Component, spracovať sa majú len jej konkrétne implementácie (Field, LookupField, Column, LookupColumn). Aj v prípade, že je abstraktná trieda vyradená zo spracovania, zdedené členské premenné tried, ktoré od nej dedia, sú spracované normálne. To znamená, že v prípade triedy Component je samotná trieda vyradená zo spracovania, ale jej členské premenné je možné anotovať JAXB anotáciami.
    • @XmlID anotácia označuje premennú objektu (resp. get/set metódu), ktorá je použiteľná ako kľúč. Typ takto označenej premennej, či metódy musí byť java.lang.String. Táto anotácia môže byť použitá spolu s anotáciou @XmlAttribute.
      
      @XmlID
      @XmlAttribute(required = true)
      public String getName() {
          return name;
      }
      
    • @XmlIDREF anotácia označuje členskú premennú ktorá sa prostredníctvom kľúča odkazuje na existujúci element.
      
      @XmlAttribute(name = "table", required = true)
      @XmlIDREF
      public Table getTable() {
          return table;
      }
      
  2. Aby bolo možné spracovať XML dokument a zobraziť ho do anotovaných tried, je potrebné zadefinovať kontext pre JAXB. Toto je možné realizovať pomocou súboru jaxb.index, ktorý je umiestnený v balíku anotovaných tried. Tento súbor má jednoduchý formát. Obsahuje zoznam názvov tried (na každý riadok jedna), ktoré má JAXB spracovať. Zvyčajne stačí uviesť triedu predstavujúcu koreňový element, keďže JAXB spracuje aj ďalšie triedy na základe štruktúry triedy - pričom používa typy členských premenných a dedičnosť. Balík, ktorý bude spracovaný je takisto označený pomocou anotácie @XmlSchema. Tento opis musí byť zapísaný v súbore package-info.java nachádzajúcom sa v danom balíku tried.

    Tieto súbory nakonfigurované pre náš projekt si môžete stiahnuť z jaxb.zip.

Zdroje
  1. Anotácie:
  2. Viac o JAXB:
  3. Zdrojové kódy:
    • jaxb.zip - konfiguračné súbory umožňujúce použitie knižnice JAXB.
comments powered by Disqus