Programavimas

„Java-XML“ atvaizdavimas tapo lengvas naudojant JAXB 2.0

„Java Architecture for XML Binding“ yra galingas ir praktiškas būdas dirbti su XML turiniu iš „Java“ programų. Naujai išleistas JAXB 2.0 siūlo daug naujų funkcijų, įskaitant visišką visų XML schemos funkcijų palaikymą, žymiai mažiau sugeneruotų klasių, sugeneruotų klasių, kuriomis lengviau manipuliuoti, ir lankstesnį patvirtinimo mechanizmą.

Norėdami suprasti, kaip tvarkyti XML dokumentus „Java“ sistemoje naudojant JAXB 2.0, turime atkreipti dėmesį į du pagrindinius JAXB komponentus:

  • Įrišimo kompiliatorius, kuris susieja nurodytą XML schemą su sukurtų „Java“ klasių rinkiniu
  • Įpareigojanti vykdymo trukmės sistema, suteikianti atskleidimo, skirstymo ir patvirtinimo funkcijas

JAXB įrišimo kompiliatorius (arba xbj) leidžia generuoti Java klases iš tam tikros XML schemos. JAXB įrišimo kompiliatorius paverčia XML schemą į „Java“ klasių rinkinį, atitinkantį XML schemoje aprašytą struktūrą. Šios klasės yra komentuojamos specialiomis JAXB anotacijomis, kurios pateikia vykdymo laiko struktūrą susiejimais, reikalingais atitinkamiems XML dokumentams apdoroti.

Įrišimo vykdymo trukmės sistema suteikia efektyvų ir lengvai naudojamą mechanizmą, skirtą išsklaidyti (arba skaityti) ir sutvarkyti (arba rašyti) XML dokumentus. Tai leidžia jums paversti XML dokumentą į „Java“ objektų hierarchiją (neskaidyti) arba, atvirkščiai, „Java“ objektų hierarchiją paversti XML formatu (sutvarkymas). Terminas skirstymas tradiciškai nurodo kariuomenės disponavimą tam tikru tinkamu būdu. Tinklo tinkle tai reiškia duomenų elementų įdėjimą į buferį, prieš juos siunčiant ryšio kanalu.

Kartu šie du komponentai sukuria technologiją, leidžiančią „Java“ kūrėjams lengvai valdyti XML duomenis „Java“ objektų pavidalu, nereikia žinoti smulkių „Simple API for XML Processing“ (SAX) ar „Document Object Model“ (DOM) detalių. , ar net XML schemos subtilybes.

JAXB prielaidos

Norėdami pradėti naudotis JAXB 2.0, jums reikia:

  • „Java Platform“, standartinis leidimas 5: JAXB 2.0 labai priklauso nuo „Java SE 5“ funkcijų, tokių kaip anotacijos ir bendrieji duomenys
  • JAXB 2.0 diegimas

Šis straipsnis buvo parašytas naudojant „GlassFish JAXB“ nuorodų diegimo kandidatą.

Generuokite „Java“ klases naudodami JAXB kompiliatorių

JAXB kompiliatorius susieja XML schemą su „Java“ klasių rinkiniu. XML schema yra XML dokumentas, labai tiksliai apibūdinantis elementus ir atributus, patvirtintus tam tikro tipo XML dokumentuose. Šiame pavyzdyje mes naudojame mokymo kursų rezervavimo sistemą, kuri gali priimti užsakymus XML formatu. Tipiškas užsakymas atrodo taip:

    10 Coyote Avenue, Arizona, JAV 

Atitinkama XML schema apibūdina, kaip rezervuojamas mokymo kursas, ir pateikiama išsami informacija apie užsakytą kursą, priimtus studentus, rezervuojančią įmonę ir pan. XML schemos aprašymas yra labai tikslus ir gali apimti tokią informaciją kaip elementų, leidžiamų objektų sąraše, skaičius (kardinalumas), pasirenkamus ir privalomus atributus ir kt. Mokymo kursų rezervavimo schema (vadinama kursų rezervavimas.xsd) rodomas čia:

Komandinės eilutės įrankis xjc paleidžia JAXB kompiliatorių. Norėdami paleisti JAXB kompiliatorių pagal mūsų schemą, vykdome šią komandą:

 $ xjc kursas-booking.xsd -p nz.co.equinox.training.domain.booking -d src / generuotas

Tai sukurs „Java“ klasių rinkinį, komentuojamą JAXB 2.0 anotacijomis. Kai kurios naudingesnės parinktys aprašytos čia:

  • -d : Įdėkite sugeneruotus failus į šį katalogą.
  • -p : Įdėkite sugeneruotus failus į šį paketą.
  • -nv: Nevykdykite griežto įvesties schemos patvirtinimo.
  • -httpproxy : Naudokitės tuo, jei esate už tarpinio serverio. Priima formatą [vartotojas [: slaptažodis] @] proxyHost [: proxyPort].
  • -klakas : Jei reikia, nurodykite klasės kelią.
  • -Tik skaitymui: Generuoja tik skaitomus šaltinio kodo failus, jei jūsų OS tai palaiko.

Yra ir atitikmuo skruzdė užduotis, todėl ją gana lengva integruoti į „Ant“ ar „Maven“ pagrįstą kūrimo procesą.

Sugeneruotų klasių sąrašas rodomas čia:

 „CompanyType.java“ „ContactType.java“ „CourseBooking.java ObjectFactory.java“ „StudentType.java“

Ankstesnių JAXB versijų vartotojai gali pastebėti, kad tai yra menkas anotuotų ir visiškai dokumentuotų „Java“ klasių rinkinys, o ne sudėtingesnis sąsajų ir ankstesnių versijų diegimas. Taigi turime mažiau sugeneruotų klasių, lengvesnį ir elegantiškesnį kodą. Ir, kaip pamatysite kitame skyriuje, lengva manipuliuoti šiomis klasėmis.

XML dokumento panaikinimas

„Unmarshalling“ yra procesas, kai XML dokumentas paverčiamas atitinkamu „Java“ objektų rinkiniu. JAXB 2.0 lengva pašalinti. Pirma, jūs sukuriate JAXBContext konteksto objektas. Konteksto objektas yra pradinis taškas atliekant skirstymą, pašalinimą ir patvirtinimą. Čia nurodote „Java“ paketą, kuriame yra jūsų JAXB susietos klasės:

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

Norėdami panaikinti XML dokumentą, sukurkite Unmarshaller iš konteksto, kaip parodyta čia:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

unmhallhaller gali apdoroti XML duomenis iš įvairiausių duomenų šaltinių: failų, įvesties srautų, URL, DOM objektų, SAX analizatorių ir kt. Čia mes pateikiame paprastą Failas objektas, nukreipiantis į mūsų XML dokumentą. unmhallhaller grąžina įvestą JAXBElementas, iš kurio mes galime gauti savo nemaršiuotą objektą naudodami getValue () metodas:

JAXBElement bookingElement = (JAXBElement) unmarshaller.unmarshal (naujas failas ("src / test / resources / xml / booking.xml"));

„CourseBooking booking“ = bookingElement.getValue ();

Dokumento patvirtinimas

Dokumento patvirtinimas yra procesas, užtikrinantis, kad jūsų XML dokumentas atitinka apibrėžimą, pateiktą atitinkamoje XML schemoje. Tai svarbus bet kurio projekto, susijusio su XML mainais, aspektas, ypač jei XML yra iš kitų sistemų. Dokumentų patvirtinimas naudojant JAXB 2.0 yra lengvesnis ir lankstesnis nei ankstesnėse versijose. Galite tiesiog pritvirtinti „ValidatonEventHandler“ į unmhallhaller prieš pašalindami XML dokumentą, kaip parodyta čia:

 unmarshaller.setEventHandler (naujas BookingValidationEventHandler ());

Patvirtinimo įvykių tvarkytojas įgyvendina „ValidationEventHandler“ sąsaja ir „rankEvent“ () metodas, kaip parodyta čia:

viešosios klasės „BookingValidationEventHandler“ įgyvendina „ValidationEventHandler“ {

viešoji loginė „handEvent“ („ValidationEvent ve“) {

if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator lokatorius = ve.getLocator (); // Spausdinti pranešimą iš valdation event System.out.println ("Neteisingas užsakymo dokumentas:" + locator.getURL ()); System.out.println ("Klaida:" + ve.getMessage ()); // Išvesties eilutės ir stulpelio numeris System.out.println ("Klaida stulpelyje" + locator.getColumnNumber () + ", eilutė" + locator.getLineNumber ()); } return true; }}

Čia mes tiesiog atspausdiname išsamią klaidos informaciją, tačiau tikroje programoje gali būti tinkamas šiek tiek nereikšmingesnis būdas. Kai kuriais atvejais netgi galite pagalvoti, kad patvirtinimo klaida nėra „show-stopper“ ir kad ji neužblokuos apdorojimo. Grįždamas tiesą, jūs sakote unmhallhaller tęsti nesupratimo procesą: „false“ procesas nutraukiamas su atitinkama išimtimi.

Dokumento pavyzdys

Parengimas apima jūsų „Java“ klasių pavertimą XML formatu. JAXB 2.0, kurti ir valdyti šias „Java“ klases yra paprasta. Daugeliu atvejų galite juos traktuoti kaip įprastas „Java“ klases, kaip parodyta čia:

 „CourseBooking booking“ = naujas „CourseBooking“ (); booking.setCourseReference („UML-101“); booking.setTotalPrice (naujas „BigDecimal“ (10000)); ...

Atminkite, kad vis tiek galite naudoti ObjectFactory klasės, panašiai kaip ją naudojote JAXB 1.0, kaip parodyta šiame sąraše. Tačiau, skirtingai nei JAXB 1.0, nėra jokių sąsajų ar diegimo klasių: visi domeno objektai yra tik komentuoti „JavaBeans“ komponentai.

 Gamykla „ObjectFactory“ = nauja „ObjectFactory“ (); CourseBooking booking = factory.createCourseBooking (); ...

Nors dauguma XML duomenų tipų tiesiogiai susiejami su įprastomis „Java“ klasėmis, tam tikriems duomenų tipams, pvz., Datoms, reikalingas specialus apdorojimas. Tokiais atvejais turite naudoti DatatypeFactory, kaip parodyta čia:

 DatatypeFactory duomenų tipai = DatatypeFactory.newInstance (); booking.setCourseDate (duomenų tipai.newXMLGregorianCalendarDate (2006,06,15,0));

Kai jūsų domeno objektas bus inicializuotas, naudokite JAXB kontekstą, kad sukurtumėte Maršalu objektas ir spausdintas JAXBElementas. Kuriant skirstytojas yra paprastas:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Tada sukursite JAXBElementas objektas, kuris apima jūsų domeno objektą. Įrašytas JAXBElementas atitinka šaknies elementą complexType jūsų XML dokumento. Tada naudokite sugeneruotą ObjectFactory klasę taip:

 JAXBElement bookingElement = (naujas ObjectFactory ()). CreateBooking (užsakymas);

Šiame pavyzdyje nustatome ypatybę, kad išvestis būtų suformatuota naudoti žmonėms, tada parašykite į standartinę išvestį:

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

Čia rodomas visas kodo pavyzdys:

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

„CourseBooking booking“ = naujas „CourseBooking“ (); booking.setCourseReference („UML-101“); booking.setTotalPrice (naujas „BigDecimal“ (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory duomenų tipai = DatatypeFactory.newInstance (); booking.setCourseDate (duomenų tipai.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (naujas „BigDecimal“ (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (naujas „StudentType“); booking.getStudent (). get (0) .setFirstName ("Jonas"); booking.getStudent (). get (0) .setSurname („Smith“); booking.setCompany (naujas „CompanyType“); booking.getCompany (). setName ("Klientai, įskaitant"); booking.getCompany (). setContact (naujas „ContactType“); booking.getCompany (). getContact (). setName ("Paulius"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("10 kliento gatvė");

// Maršalas į System.out Marshaller marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (naujas ObjectFactory ()). CreateBooking (užsakymas); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal (bookingElement, System.out);

Paleidus šį kodą bus sukurtas kažkas panašaus: