Programovanie

Mapovanie Java-XML je jednoduché pomocou JAXB 2.0

Java Architecture for XML Binding poskytuje výkonný a praktický spôsob práce s obsahom XML z aplikácií Java. Novo vydaný JAXB 2.0 ponúka mnoho nových funkcií, vrátane plnej podpory všetkých funkcií schémy XML, podstatne menej vygenerovaných tried, vygenerovaných tried, s ktorými sa manipuluje ľahšie, a flexibilnejšieho overovacieho mechanizmu.

Aby sme pochopili, ako spracovávať dokumenty XML v Jave pomocou JAXB 2.0, musíme sa pozrieť na dve hlavné komponenty JAXB:

  • Kompilátor väzieb, ktorý viaže danú schému XML na množinu vygenerovaných tried Java
  • Väzbový runtime rámec, ktorý poskytuje funkcie zaraďovania, zaraďovania a overovania

Kompilátor väzieb JAXB (alebo xbj) umožňuje generovať triedy Java z danej schémy XML. Kompilátor väzieb JAXB transformuje schému XML na kolekciu tried Java, ktoré zodpovedajú štruktúre opísanej v schéme XML. Tieto triedy sú anotované špeciálnymi anotáciami JAXB, ktoré poskytujú runtime framework s mapovaniami, ktoré potrebuje na spracovanie zodpovedajúcich XML dokumentov.

Väzbový runtime rámec poskytuje efektívny a ľahko použiteľný mechanizmus na zrušenie zdieľania (alebo čítania) a zhromažďovania (alebo zápisu) dokumentov XML. Umožní vám transformovať dokument XML na hierarchiu objektov Java (unmarshalling) alebo naopak, transformovať hierarchiu objektov Java do formátu XML (marshalling). Termín zoradenie tradične odkazuje na disponovanie s jednotkami nejakým vhodným spôsobom. V sieťových sieťach to znamená umiestnenie dátových položiek do medzipamäte pred ich odoslaním cez komunikačný kanál.

Kombináciou týchto dvoch komponentov vzniká technológia, ktorá umožňuje vývojárom Java ľahko manipulovať s údajmi XML vo forme objektov Java, bez toho, aby museli poznať dôkladné podrobnosti Simple API for XML Processing (SAX) alebo Document Object Model (DOM). , alebo dokonca jemnosti schémy XML.

Predpoklady JAXB

Na začiatok s JAXB 2.0 potrebujete:

  • Java Platform, Standard Edition 5: JAXB 2.0 sa vo veľkej miere spolieha na funkcie Java SE 5, ako sú anotácie a generické podklady
  • Implementácia JAXB 2.0

Tento článok bol napísaný pomocou kandidáta na vydanie referenčnej implementácie GlassFish JAXB.

Generujte triedy Java pomocou kompilátora JAXB

Kompilátor JAXB viaže schému XML na množinu tried Java. Schéma XML je dokument XML, ktorý veľmi presne popisuje prvky a atribúty povolené v určitom type dokumentu XML. V tomto príklade používame rezervačný systém školiacich kurzov, ktorý dokáže prijímať objednávky vo formáte XML. Typická objednávka vyzerá takto:

    10 Coyote Avenue, Arizona, USA 

Zodpovedajúca schéma XML popisuje, ako je rezervovaný výcvikový kurz, a obsahuje podrobnosti o rezervovanom kurze, zapísaných študentoch, spoločnosti, ktorá uskutočnila rezerváciu atď. Popis schémy XML je mimoriadne dôsledný a môže obsahovať podrobnosti, ako napríklad počet povolených prvkov v zozname objektov (mohutnosť), voliteľné a povinné atribúty a ďalšie. Schéma rezervácií výcvikových kurzov (tzv rezervácia kurzu.xsd) sa zobrazuje tu:

Nástroj príkazového riadku xjc spustí kompilátor JAXB. Ak chcete spustiť kompilátor JAXB proti našej schéme, spustíme nasledujúci príkaz:

 $ xjc kurz-booking.xsd -p nz.co.equinox.training.domain.booking -d src / generované

Toto vygeneruje množinu tried Java s anotáciami s anotáciami JAXB 2.0. Tu sú popísané niektoré z užitočnejších možností:

  • -d : Umiestnite vygenerované súbory do tohto adresára.
  • -p : Vložte vygenerované súbory do tohto balíka.
  • -nv: Nevykonávajte prísnu validáciu vstupnej schémy.
  • -httpproxy : Toto použite, ak pracujete za proxy serverom. Berie formát [používateľ [: heslo] @] proxyHost [: proxyPort].
  • -classpath : Ak je to potrebné, zadajte cestu ku triede.
  • -iba na čítanie: Generuje súbory zdrojového kódu iba na čítanie, ak to váš operačný systém podporuje.

Existuje aj ekvivalent mravec úloha, vďaka ktorej je celkom ľahké sa integrovať do procesu zostavovania založeného na Ant alebo Maven.

Zoznam vygenerovaných tried je uvedený tu:

 CompanyType.java ContactType.java CourseBooking.java ObjectFactory.java StudentType.java

Používatelia predchádzajúcich verzií JAXB si môžu všimnúť, že sa jedná o úhľadnú sadu anotovaných a plne zdokumentovaných tried Java, a nie o ťažkopádnejšiu sadu rozhraní a implementácií predchádzajúcich verzií. Máme teda menej generované triedy a ľahší a elegantnejší kód. A ako uvidíte v nasledujúcej časti, manipulácia s týmito triedami je jednoduchá.

Zrušenie zdieľania dokumentu XML

Zrušenie zdieľania je proces prevodu dokumentu XML na zodpovedajúcu sadu objektov Java. Zrušenie zdieľania v JAXB 2.0 je jednoduché. Najskôr vytvoríte a JAXBContext kontextový objekt. Kontextový objekt je východiskovým bodom pre operácie zaraďovania, oddeľovania a overovania. Tu určíte balík Java obsahujúci vaše triedy mapované JAXB:

 JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");

Ak chcete zrušiť rozdelenie dokumentu XML, vytvoríte Unmarshaller z kontextu, ako je uvedené tu:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

The neplatič môže spracovávať údaje XML z najrôznejších zdrojov údajov: súbory, vstupné toky, adresy URL, objekty DOM, analyzátory SAX a ďalšie. Tu uvádzame jednoduché Súbor objekt ukazujúci na náš dokument XML. The neplatič vráti zadaný JAXBElement, z ktorého môžeme získať náš neviazaný objekt pomocou getValue () metóda:

JAXBElement bookingElement = (JAXBElement) unmarshaller.unmarshal (nový súbor ("src / test / resources / xml / booking.xml"));

CourseBooking booking = bookingElement.getValue ();

Validácia dokumentu

Validácia dokumentu je proces zaistenia toho, aby váš dokument XML zodpovedal definícii uvedenej v príslušnej schéme XML. Je to dôležitý aspekt každého projektu, ktorý zahŕňa výmeny XML, najmä ak XML pochádza z iných systémov. Validácia dokumentov v JAXB 2.0 je ľahšia a flexibilnejšia ako v predchádzajúcich verziách. Môžete jednoducho pripevniť a ValidatonEventHandler do neplatič pred zrušením zdieľania dokumentu XML, ako je to zobrazené tu:

 unmarshaller.setEventHandler (nový BookingValidationEventHandler ());

Obslužná rutina udalosti overenia implementuje ValidationEventHandler rozhranie a handleEvent () zobrazená tu:

verejná trieda BookingValidationEventHandler implementuje ValidationEventHandler {

public boolean handleEvent (ValidationEvent ve) {

if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator locator = ve.getLocator (); // Tlač správy z udalosti Valdation System.out.println ("Neplatný rezervačný dokument:" + locator.getURL ()); System.out.println ("Chyba:" + ve.getMessage ()); // Číslo výstupného riadku a stĺpca System.out.println ("Chyba v stĺpci" + locator.getColumnNumber () + ", riadok" + locator.getLineNumber ()); } návrat pravdivý; }}

Tu iba vytlačíme podrobnosti o chybe, ale v skutočnej aplikácii môže byť vhodné nejaké menej triviálne zaobchádzanie. V niektorých prípadoch môžete dokonca zvážiť, že chyba overenia nie je zarážkou a že nebude blokovať spracovanie. Vrátením hodnoty true poviete neplatič pokračovať v procese zaraďovania: hodnota false by ukončila proces s príslušnou výnimkou.

Zaradenie dokumentu

Zaradenie zahŕňa transformáciu vašich tried Java do formátu XML. V JAXB 2.0 je vytváranie a manipulácia s týmito triedami Java jednoduchá. Vo väčšine prípadov ich môžete považovať za bežné triedy Java, ako je to znázornené tu:

 Rezervácia CourseBooking = nová CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (nový BigDecimal (10 000)); ...

Pamätajte, že stále môžete používať ObjectFactory triedy podobne, ako ste ho použili v JAXB 1.0, ako je uvedené v nasledujúcom zozname. Avšak na rozdiel od JAXB 1.0 neexistujú žiadne rozhrania ani implementačné triedy: všetky objekty domény sú iba anotovanými komponentami JavaBeans.

 ObjectFactory factory = nový ObjectFactory (); Rezervácia kurzuBooking = factory.createCourseBooking (); ...

Aj keď sa väčšina dátových typov XML mapuje priamo na bežné triedy Java, pre určité typy údajov, ako sú napríklad dátumy, je potrebné určité zaobchádzanie. V týchto prípadoch musíte použiť Továreň na dátový typ, ako je zobrazené tu:

 DatatypeFactory datatypes = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0));

Akonáhle je váš doménový objekt inicializovaný, vytvorte pomocou kontextu JAXB Marshaller objekt a strojopis JAXBElement. Vytvára sa zoraďovateľ je jednoduchý:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Ďalej vytvoríte a JAXBElement objekt, ktorý zapuzdruje váš doménový objekt. Zadaný JAXBElement zodpovedá koreňovému prvku zložitý typ vášho dokumentu XML. Potom použite vygenerovaný ObjectFactory triedy nasledovne:

 JAXBElement bookingElement = (nový ObjectFactory ()). CreateBooking (rezervácia);

V tomto príklade nastavíme vlastnosť tak, že výstup bude naformátovaný na humánne použitie a potom sa zapíše na štandardný výstup:

 marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal (bookingElement, System.out);

Celá ukážka kódu je zobrazená tu:

JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");

Rezervácia CourseBooking = nová CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (nový BigDecimal (10 000)); booking.setInvoiceReference ("123456"); DatatypeFactory datatypes = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (nový BigDecimal (10 000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (nový StudentType ()); booking.getStudent (). get (0) .setFirstName ("John"); booking.getStudent (). get (0) .setSurname ("Smith"); booking.setCompany (new CompanyType ()); booking.getCompany (). setName ("Klienti vč."); booking.getCompany (). setContact (nový ContactType ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("ulica 10 klientov");

// Marshal to System.out Marshaller marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (nový ObjectFactory ()). CreateBooking (rezervácia); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal (bookingElement, System.out);

Spustenie tohto kódu vygeneruje niečo také:

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