Sprievodca po JAXB

1. Úvod

Toto je úvodný článok o JAXB (Java Architecture for XML Binding).

Najskôr si ukážeme, ako prevádzať objekty Java na XML a naopak, a potom sa zameriame na generovanie tried Java zo schémy XML a naopak pomocou doplnku JAXB-2 Maven.

2. Prehľad

JAXB poskytuje rýchly a pohodlný spôsob zaraďovania (zápisu) objektov Java do XML a zrušenia zaraďovania (čítania) XML do objektov. Podporuje väzbový rámec, ktorý mapuje prvky a atribúty XML na polia a vlastnosti Java pomocou anotácií Java.

Plugin JAXB-2 Maven deleguje väčšinu svojej práce na jeden z dvoch nástrojov JJD dodaných XJC a Schemagen.

3. Anotácie JAXB

JAXB používa anotácie Java na rozšírenie vygenerovaných tried o ďalšie informácie. Pridanie takýchto anotácií k existujúcim triedam Java ich pripraví na behové prostredie JAXB.

Najprv si vytvorme jednoduchý objekt Java na ilustráciu zoradenia a zrušenia zoradenia:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) verejná trieda Book {private Long id; súkromné ​​meno reťazca; súkromný autor reťazcov; súkromné ​​Dátum; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlElement (name = "title") public void setName (názov reťazca) {this.name = name; } @XmlTransient public void setAuthor (autor reťazca) {this.author = autor; } // konštruktor, getre a setre}

Vyššie uvedená trieda obsahuje nasledujúce anotácie:

  • @XmlRootElement: Názov koreňového prvku XML je odvodený od názvu triedy a môžeme tiež určiť názov koreňového prvku XML pomocou jeho atribútu name
  • @XmlType: definujte poradie, v akom sú polia zapísané do súboru XML
  • @XmlElement: definovať skutočný názov prvku XML, ktorý sa bude používať
  • @XmlAttribute: definujte, že pole id je mapované ako atribút namiesto prvku
  • @XmlTransient: anotujte polia, ktoré nechceme zahrnúť do XML

Viac podrobností o anotácii JAXB nájdete v nasledujúcom odkaze.

4. Zaraďovanie - prevádzanie objektov Java na XML

Marshalling poskytuje klientskej aplikácii schopnosť prevádzať strom objektov Java odvodený z JAXB do údajov XML. V predvolenom nastavení je Marshaller používa pri generovaní údajov XML kódovanie UTF-8. Ďalej budeme generovať súbory XML z objektov Java.

Vytvorme jednoduchý program pomocou JAXBContext ktorá poskytuje abstrakciu na správu informácií o väzbe XML / Java potrebných na implementáciu operácií rámca väzby JAXB:

public void marshal () hodí JAXBException, IOException {Book book = new Book (); book.setId (1L); book.setName ("Kniha1"); book.setAuthor („Autor1“); book.setDate (nový dátum ()); JAXBContext context = JAXBContext.newInstance (Book.class); Marshaller mar = context.createMarshaller (); mar.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal (kniha, nový súbor ("./ book.xml")); }

The javax.xml.bind.JAXBContext trieda poskytuje klientovi vstupný bod do rozhrania JAXB API. Štandardne JAXB neformátuje dokument XML. Ušetrí to miesto a zabráni sa tomu, aby sa akýkoľvek biely priestor mohol náhodne interpretovať ako významný.

Aby sme mali výstup vo formáte JAXB, jednoducho nastavíme Marshaller.JAXB_FORMATTED_OUTPUT majetok do pravda na Marshaller. Metóda marshal používa objekt a výstupný súbor, kam uložiť generované XML ako parametre.

Keď spustíme vyššie uvedený kód, môžeme skontrolovať výsledok v book.xml na overenie, že úspešne prevádzame objekt Java na údaje XML:

  Kniha 1 2016-11-12T11: 25: 12.227 + 07: 00 

5. Zrušenie zaradenia - prevod XML na objekt Java

Zrušenie zoradenia poskytuje klientskej aplikácii schopnosť prevádzať údaje XML na objekty Java odvodené od JAXB.

Použime JAXB Unmarshaller zrušiť maršal našich book.xml späť na objekt Java:

public Book unmarshall () hodí JAXBException, IOException {JAXBContext context = JAXBContext.newInstance (Book.class); return (Book) context.createUnmarshaller () .unmarshal (nový FileReader ("./ book.xml")); }

Keď spustíme vyššie uvedený kód, môžeme skontrolovať výstup z konzoly a overiť, či sme úspešne konvertovali údaje XML na objekt Java:

Kniha [id = 1, name = Book1, autor = null, date = so 12. novembra 11:38:18 ICT 2016]

6. Komplexné dátové typy

Pri manipulácii so zložitými dátovými typmi, ktoré nemusia byť priamo dostupné v JAXB, môžeme napísať adaptér, ktorý indikuje JAXB, ako spravovať konkrétny typ.

Pomocou JAXB XmlAdapter, môžeme definovať vlastný kód na prevod nemeniteľnej triedy na niečo, čo dokáže JAXB zvládnuť. The @XmlJavaTypeAdapter anotácia používa adaptér, ktorý rozširuje XmlAdapter triedy na vlastné zoradenie.

Vytvorme adaptér na zadanie formátu dátumu pri zaraďovaní:

public class DateAdapter extends XmlAdapter {private static final ThreadLocal dateFormat = new ThreadLocal () {@Override protected DateFormat initialValue () {return new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); }}; @Override public Date unmarshal (String v) vyvolá výnimku {return dateFormat.get (). Parse (v); } @Override public String marshal (Date v) throws Exception {return dateFormat.get (). Format (v); }}

Používame formát dátumu “rrrr-MM-dd HH: mm: ss" konvertovať Dátum do String pri zoraďovaní a ThreadLocal aby naše Formát dátumu bezpečné pre vlákna.

Aplikujme DateAdapter k nášmu Kniha:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) verejná trieda Book {private Long id; súkromné ​​meno reťazca; súkromný autor reťazcov; súkromné ​​Dátum; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlTransient public void setAuthor (autor reťazca) {this.author = autor; } @XmlElement (name = "title") public void setName (názov reťazca) {this.name = name; } @XmlJavaTypeAdapter (DateAdapter.class) public void setDate (dátum a dátum) {this.date = dátum; }}

Keď spustíme vyššie uvedený kód, môžeme skontrolovať výsledok v book.xml overiť, že sme úspešne previedli náš objekt Java do XML pomocou nového formátu dátumu “rrrr-MM-dd HH: mm: ss“:

  Book1 2016-11-10 23:44:18 finále 

7. Doplnok JAXB-2 Maven

Tento doplnok používa rozhranie Java API pre väzbu XML (JAXB), verzia 2+, na generovanie tried Java zo schém XML (a voliteľne väzobných súborov) alebo na vytvorenie schémy XML z anotovanej triedy Java.

Upozorňujeme, že existujú dva základné prístupy k budovaniu webových služieb, Zmluva posledná a Najskôr zmluva. Viac podrobností o týchto prístupoch nájdete v nasledujúcom odkaze.

7.1. Generovanie triedy Java z XSD

Plugin JAXB-2 Maven používa nástroj XJC od JDK, nástroj kompilátora JAXB Binding, ktorý generuje triedy Java z XSD (XML Schema Definition).

Vytvorme jednoduchý user.xsd súbor a pomocou doplnku JAXB-2 Maven vygenerujte triedy Java z tejto schémy XSD:

Nakonfigurujme doplnok JAXB-2 Maven:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 xjc xjc src / main / resources / global.xjb src / main / resources / user.xsd $ {basedir} / src / main / java false 

Tento doplnok predvolene vyhľadáva súbory XSD v src / main / xsd. Vyhľadanie XSD môžeme nakonfigurovať úpravou konfiguračnej časti tohto doplnku v priečinku pom.xml podľa toho.

Štandardne sú tieto triedy Java generované v cieľ / generované-zdroje / jaxb priečinok. Výstupný adresár môžeme zmeniť pridaním outputDirectory element do konfigurácie pluginu. Môžeme tiež pridať a clearOutputDir prvok s hodnotou false, aby sa zabránilo vymazaniu súborov v tomto adresári.

Môžeme tiež nakonfigurovať globálnu väzbu JAXB, ktorá prepíše predvolené pravidlá väzby:

The global.xjb vyššie prepisuje Dátum Čas napíš do java.util.Calendar typu.

Keď zostavujeme projekt, generuje súbory triedy v src / main / java priečinok a balíček com.baeldung.jaxb.gen.

7.2. Generovanie schémy XSD z Javy

Rovnaký doplnok používa nástroj dodaný JDK Schemagen. Toto je kompilátorový nástroj JAXB Binding, ktorý dokáže vygenerovať schému XSD z tried Java. Aby mohla byť trieda Java vhodná pre kandidáta na schému XSD, musí byť táto trieda anotovaná znakom @XmlType anotácia.

Znovu použijeme súbory triedy Java z predchádzajúceho príkladu. Nakonfigurujme doplnok:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 schemagen schemagen src / main / java / com / baeldung / jaxb / gen src / main / resources false / jaxb / gen užívateľ user-gen.xsd 

V predvolenom nastavení prehľadáva JAXB všetky priečinky pod src / main / java rekurzívne pre anotované triedy JAXB. Môžeme určiť inú zdroj priečinok pre naše triedy s poznámkami JAXB pridaním a zdroj prvku do konfigurácie doplnku.

Môžeme tiež zaregistrovať a transformSchemas, postprocesor zodpovedný za pomenovanie schémy XSD. Funguje to tak, že sa zhodujete s menný priestor s menným priestorom súboru @XmlType vašej triedy Java.

Keď staviame projekt, vygeneruje sa a user-gen.xsd súbor v src / main / resources adresár.

8. Záver

V tomto článku sme sa venovali úvodným konceptom na JAXB. Podrobnosti nájdete na domovskej stránke JAXB.

Zdrojový kód tohto článku môžeme nájsť na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found