Java Architecture for XML Binding tarjoaa tehokkaan ja käytännöllisen tavan työskennellä XML-sisällön kanssa Java-sovelluksissa. Äskettäin julkaistu JAXB 2.0 tarjoaa monia uusia ominaisuuksia, mukaan lukien kaikkien XML-skeeman ominaisuuksien täyden tuen, huomattavasti vähemmän luotuja luokkia, luotuja luokkia, joita on helpompi käsitellä, ja joustavamman vahvistusmekanismin.
Ymmärtääksemme kuinka XML-asiakirjoja käsitellään Java-järjestelmässä JAXB 2.0: lla, meidän on tarkasteltava kahta JAXB-pääkomponenttia:
- Sidontakääntäjä, joka sitoo tietyn XML-skeeman luotujen Java-luokkien joukkoon
- Sitova ajonaikainen kehys, joka tarjoaa purkamis-, järjestely- ja validointitoiminnot
JAXB-sidontakääntäjä (tai xbj
) avulla voit luoda Java-luokkia tietystä XML-mallista. JAXB-sidontakääntäjä muuntaa XML-mallin Java-luokkakokoelmaksi, joka vastaa XML-skeemassa kuvattua rakennetta. Nämä luokat on merkitty erityisillä JAXB-merkinnöillä, jotka tarjoavat ajonaikaisen kehyksen vastaavien XML-asiakirjojen käsittelemiseen tarvittavilla kartoituksilla.
Sitova ajonaikainen kehys tarjoaa tehokkaan ja helppokäyttöisen mekanismin XML-asiakirjojen purkamisen (tai lukemisen) ja jakamisen (tai kirjoittamisen) purkamiseksi. Sen avulla voit muuntaa XML-asiakirjan Java-objektien hierarkiaksi (purkaminen) tai päinvastoin muuntaa Java-objektihierarkia XML-muotoon (järjestely). Termi järjestely Perinteisesti viitataan joukkojen hävittämiseen sopivalla tavalla. Verkkoyhteydessä se viittaa datakohteiden sijoittamiseen puskuriin ennen niiden lähettämistä tietoliikennekanavan kautta.
Yhdessä nämä kaksi komponenttia tuottavat tekniikan, jonka avulla Java-kehittäjät voivat helposti muokata XML-tietoja Java-objektien muodossa tarvitsematta tietää yksinkertaisen XML-käsittelyliittymän (SAX) tai asiakirjaobjektimallin (DOM) yksityiskohtia. tai jopa XML-skeeman hienovaraisuudet.
JAXB-edellytykset
JAXB 2.0: n käytön aloittaminen edellyttää:
- Java Platform, Standard Edition 5: JAXB 2.0 luottaa suuresti Java SE 5: n ominaisuuksiin, kuten huomautuksiin ja yleisiin tietoihin
- JAXB 2.0: n toteutus
Tämä artikkeli on kirjoitettu GlassFish JAXB -viitteiden käyttöönoton ehdokkaalla.
Luo Java-luokat JAXB-kääntäjän avulla
JAXB-kääntäjä sitoo XML-skeeman Java-luokkaryhmään. XML-skeema on XML-asiakirja, joka kuvaa hyvin tarkasti tietyn tyyppisessä XML-dokumentissa hyväksytyt elementit ja määritteet. Tässä esimerkissä käytämme kurssivarausjärjestelmää, joka voi hyväksyä tilauksia XML-muodossa. Tyypillinen tilaus näyttää tältä:
10 Coyote Avenue, Arizona, USA
Vastaava XML-skeema kuvaa, kuinka kurssi varataan, ja sisältää tiedot varatusta kurssista, ilmoittautuneista opiskelijoista, varauksen tekevästä yrityksestä ja niin edelleen. XML-kaavakuvaus on erittäin tarkka ja voi sisältää yksityiskohtia, kuten sallittujen elementtien määrän objektiluettelossa (kardinaalisuus), valinnaisia ja pakollisia määritteitä ja paljon muuta. Kurssivarausten malli (kutsutaan kurssivaraukset.xsd
) näkyy tässä:
Komentorivityökalu xjc
suorittaa JAXB-kääntäjän. Jos haluat suorittaa JAXB-kääntäjän malliamme vastaan, suoritamme seuraavan komennon:
$ xjc course-booking.xsd -p nz.co.equinox.training.domain.booking -d src / luotu
Tämä luo joukon Java-luokkia, jotka on merkitty JAXB 2.0 -merkinnöillä. Joitakin hyödyllisempiä vaihtoehtoja kuvataan tässä:
-d
: Sijoita luodut tiedostot tähän hakemistoon.-p
: Sijoita luodut tiedostot tähän pakettiin.-nv
: Älä tarkista syöttökaavaa tarkasti.-httpproxy
: Käytä tätä, jos olet välityspalvelimen takana. Ottaa muodon[käyttäjä [: salasana] @] proxyHost [: proxyPort]
.-polku
: Määritä luokan polku tarvittaessa.-Lue ainoastaan
: Luo vain luku -lähdekooditiedostot, jos käyttöjärjestelmäsi tukee tätä.
On myös vastaava muurahainen
Tehtävä, jonka ansiosta integrointi muurahais- tai Maven-pohjaiseen rakennusprosessiin on melko helppoa.
Luettujen luokkien luettelo näkyy tässä:
CompanyType.java ContactType.java CourseBooking.java ObjectFactory.java StudentType.java
JAXB: n aiempien versioiden käyttäjät saattavat huomata, että tämä on huomaamaton ja täysin dokumentoitu Java-luokka, eikä aiempien versioiden raskaampi rajapinta ja toteutus. Siten meillä on vähemmän generoituja luokkia ja kevyempi ja tyylikkäämpi koodi. Ja kuten seuraavasta osiosta näet, näiden luokkien käsittely on helppoa.
XML-asiakirjan purkaminen
Poistaminen on prosessi, jolla XML-asiakirja muunnetaan vastaavaksi Java-objektijoukoksi. JAXB 2.0: n purkaminen on helppoa. Ensin luot a JAXBContext
kontekstikohde. Kontekstiobjekti on lähtökohta järjestely-, purkamis- ja validointitoiminnoille. Tässä määritetään Java-paketti, joka sisältää JAXB-kartoitetut luokat:
JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");
Voit purkaa XML-asiakirjan hallinnan luomalla Unmarshaller
kontekstista, kuten tässä on esitetty:
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();
unmarshaller
pystyy käsittelemään XML-tietoja monenlaisista tietolähteistä: tiedostoista, syöttövirroista, URL-osoitteista, DOM-objekteista, SAX-jäsentäjistä ja muusta. Tässä tarjoamme yksinkertaisen Tiedosto
XML-asiakirjaamme osoittava objekti. unmarshaller
palauttaa kirjoitetun JAXBElement
, josta voimme hankkia hallitsemattoman kohteen käyttämällä getValue ()
menetelmä:
JAXBElement bookingElement = (JAXBElement) unmarshaller.unmarshal (uusi tiedosto ("src / test / resources / xml / booking.xml"));
CourseBooking booking = bookingElement.getValue ();
Asiakirjan vahvistus
Asiakirjan vahvistus on prosessi, jolla varmistetaan, että XML-asiakirjasi vastaa vastaavassa XML-skeemassa annettua määritelmää. Se on tärkeä näkökohta kaikissa XML-vaihtoon liittyvissä projekteissa, varsinkin jos XML tulee muista järjestelmistä. JAXB 2.0: n asiakirjojen vahvistus on helpompaa ja joustavampaa kuin edellisissä versioissa. Voit yksinkertaisesti liittää a ValidatonEventHandler
että unmarshaller
ennen XML-asiakirjan purkamista, kuten tässä on esitetty:
unmarshaller.setEventHandler (uusi BookingValidationEventHandler ());
Vahvistustapahtumien käsittelijä toteuttaa ValidationEventHandler
käyttöliittymä ja kahvaEvent ()
menetelmä, kuten tässä on esitetty:
public class BookingValidationEventHandler toteuttaa ValidationEventHandler {
public boolean handleEvent (ValidationEvent ve) {
if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator locator = ve.getLocator (); // Tulosta viesti hallitustapahtumasta System.out.println ("Virheellinen varausasiakirja:" + locator.getURL ()); System.out.println ("Virhe:" + ve.getMessage ()); // Lähtörivin ja sarakkeen numero System.out.println ("Virhe sarakkeessa" + locator.getColumnNumber () + ", rivi" + locator.getLineNumber ()); } return true; }}
Tulostamme vain virheen yksityiskohdat, mutta todellisessa sovelluksessa jotkut vähemmän merkityksettömät kohtelut saattavat olla sopivia. Joissakin tapauksissa saatat jopa ajatella, että vahvistusvirhe ei ole show-stopper ja että se ei estä käsittelyä. Palauttamalla true, kerrot unmhallhaller
jatkaaksesi purkamisprosessia: epätosi lopettaa prosessin asianmukaisella poikkeuksella.
Asiakirjan esittely
Järjestelyyn kuuluu Java-luokkien muuttaminen XML-muotoon. JAXB 2.0: ssa näiden Java-luokkien luominen ja käsittely on yksinkertaista. Useimmissa tapauksissa voit vain kohdella heitä tavallisten Java-luokkien tavoin, kuten tässä on esitetty:
CourseBooking-varaus = uusi CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (uusi BigDecimal (10000)); ...
Huomaa, että voit silti käyttää ObjectFactory
luokka samalla tavalla kuin käytit sitä JAXB 1.0: ssa, kuten seuraavassa luettelossa näkyy. Toisin kuin JAXB 1.0, ei kuitenkaan ole käyttöliittymiä tai toteutusluokkia: kaikki toimialueobjektit ovat vain merkittyjä JavaBeans-komponentteja.
ObjectFactory-tehdas = uusi ObjectFactory (); CourseBooking booking = tehdas.createCourseBooking (); ...
Vaikka suurin osa XML-tietotyypeistä kartoitetaan suoraan normaaleihin Java-luokkiin, joillekin tietotyypeille, kuten päivämäärille, tarvitaan erityistä käsittelyä. Näissä tapauksissa sinun on käytettävä DatatypeFactory
, kuten tässä on esitetty:
DatatypeFactory datatyypit = DatatypeFactory.newInstance (); booking.setCourseDate (tietotyypit.newXMLGregorianCalendarDate (2006,06,15,0));
Kun toimialueesi objekti on alustettu, luo JAXB-konteksti Marshaller
esine ja kirjoitettu JAXBElement
. Luominen marshaller
on yksinkertainen:
Marshaller marshaller = jaxbContext.createMarshaller ();
Seuraavaksi luot a JAXBElement
objekti, joka kapseloi toimialueesi objektin. Kirjoitettu JAXBElement
vastaa juurielementtiä complexType
XML-dokumenttisi. Käytä sitten luotua ObjectFactory
luokka seuraavasti:
JAXBElement bookingElement = (uusi ObjectFactory ()). CreateBooking (varaus);
Tässä esimerkissä asetamme ominaisuuden niin, että lähtö muotoillaan ihmisille ja kirjoitetaan sitten vakiotulosteeseen:
marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolen.TRUE); marshaller.marshal (bookingElement, System.out);
Tässä näytetään täydellinen koodinäyte:
JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");
CourseBooking-varaus = uusi CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (uusi BigDecimal (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory datatyypit = DatatypeFactory.newInstance (); booking.setCourseDate (tietotyypit.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (uusi BigDecimal (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (uusi StudentType ()); booking.getStudent (). get (0) .setFirstName ("John"); booking.getStudent (). get (0) .setSurname ("Smith"); booking.setCompany (uusi yritystyyppi ()); booking.getCompany (). setName ("Asiakkaat mukaan lukien"); booking.getCompany (). setContact (uusi ContactType ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("10 asiakaskatu");
// Marsalkka System.out Marshallerille marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (uusi ObjectFactory ()). CreateBooking (varaus); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolen.TRUE);
marshaller.marshal (bookingElement, System.out);
Tämän koodin suorittaminen tuottaa jotain tällaista: