Programmēšana

Java-XML kartēšana ir vienkārša, izmantojot JAXB 2.0

Java arhitektūra XML saistīšanai nodrošina efektīvu un praktisku veidu, kā strādāt ar XML saturu no Java lietojumprogrammām. Nesen izlaistais JAXB 2.0 piedāvā daudzas jaunas funkcijas, tostarp visu XML shēmas funkciju pilnīgu atbalstu, ievērojami mazāk ģenerēto klašu, ģenerēto klases, ar kurām ir vieglāk manipulēt, un elastīgāku validācijas mehānismu.

Lai saprastu, kā apstrādāt XML dokumentus Java ar JAXB 2.0, mums jāaplūko divi galvenie JAXB komponenti:

  • Saistīšanas kompilators, kas konkrēto XML shēmu saista ar ģenerēto Java klašu kopu
  • Saistošs izpildlaika ietvars, kas nodrošina atdalīšanas, šķirošanas un apstiprināšanas funkcijas

JAXB iesiešanas kompilators (vai xbj) ļauj ģenerēt Java klases no noteiktas XML shēmas. JAXB iesiešanas kompilators pārveido XML shēmu Java klašu kolekcijā, kas atbilst XML shēmā aprakstītajai struktūrai. Šīs klases ir anotētas ar īpašām JAXB anotācijām, kas nodrošina izpildlaika ietvaru ar kartējumiem, kas nepieciešami atbilstošo XML dokumentu apstrādei.

Saistošā izpildlaika sistēma nodrošina efektīvu un viegli lietojamu mehānismu XML dokumentu atdalīšanai (vai lasīšanai) un sakārtošanai (vai rakstīšanai). Tas ļauj pārveidot XML dokumentu Java objektu hierarhijā (atcelšana) vai, otrādi, pārveidot Java objektu hierarhiju XML formātā (šķirošana). Termiņš šķirošana tradicionāli attiecas uz karaspēka iznīcināšanu kādā piemērotā veidā. Tīklošanā tas attiecas uz datu vienību ievietošanu buferī, pirms tos nosūta pa sakaru kanālu.

Šie divi komponenti kopā rada tehnoloģiju, kas ļauj Java izstrādātājiem viegli manipulēt ar XML datiem Java objektu veidā, nezinot sīkās detaļas par vienkāršo API XML apstrādei (SAX) vai dokumenta objekta modeli (DOM). vai pat XML shēmas smalkumus.

JAXB priekšnoteikumi

Lai sāktu darbu ar JAXB 2.0, jums ir nepieciešams:

  • Java platforma, 5. izdevums: JAXB 2.0 lielā mērā paļaujas uz Java SE 5 funkcijām, piemēram, anotācijām un vispārīgajiem
  • JAXB 2.0 ieviešana

Šis raksts tika uzrakstīts, izmantojot GlassFish JAXB atsauces ieviešanas laidiena kandidātu.

Ģenerējiet Java klases, izmantojot JAXB kompilatoru

JAXB kompilators sasaista XML shēmu ar Java klašu kopu. XML shēma ir XML dokuments, kas ļoti precīzi apraksta elementus un atribūtus, kas atļauti noteikta veida XML dokumentā. Šajā piemērā mēs izmantojam apmācību kursu rezervēšanas sistēmu, kas var pieņemt pasūtījumus XML formātā. Tipisks pasūtījums izskatās šādi:

    10 Coyote Avenue, Arizona, ASV 

Atbilstošā XML shēma apraksta apmācības kursa rezervēšanu un satur informāciju par rezervēto kursu, uzņemtajiem studentiem, uzņēmumu, kas veic rezervāciju, un tā tālāk. XML shēmas apraksts ir ārkārtīgi precīzs, un tajā var iekļaut detaļas, piemēram, objektu sarakstā atļauto elementu skaitu (kardinalitāte), izvēles un obligātos atribūtus un daudz ko citu. Apmācību kursu rezervēšanas shēma (saukta kursu rezervēšana.xsd) ir parādīts šeit:

Komandrindas rīks xjc palaiž JAXB kompilatoru. Lai palaistu JAXB kompilatoru pret mūsu shēmu, mēs izpildām šādu komandu:

 $ xjc course-booking.xsd -p nz.co.equinox.training.domain.booking -d src / generated

Tādējādi tiks ģenerēts Java klašu kopums, kas anotēts ar JAXB 2.0 anotācijām. Dažas noderīgākas iespējas ir aprakstītas šeit:

  • -d : Ievietojiet izveidotos failus šajā direktorijā.
  • -p : Ievietojiet ģenerētos failus šajā paketē.
  • -nv: Neveiciet stingru ievades shēmas validāciju.
  • -httpproxy : Izmantojiet to, ja atrodaties aiz starpniekservera. Tiek izmantots formāts [lietotājs [: parole] @] proxyHost [: proxyPort].
  • -ceļš : Ja nepieciešams, norādiet klases ceļu.
  • -tikai lasīt: Ģenerē tikai lasāmus pirmkodu failus, ja jūsu OS to atbalsta.

Ir arī ekvivalents skudra uzdevumu, kas padara to diezgan viegli integrējamu Ant vai Maven balstītā būvēšanas procesā.

Ģenerēto klašu saraksts ir parādīts šeit:

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

JAXB iepriekšējo versiju lietotāji var pamanīt, ka tas ir grūts anotētu un pilnībā dokumentētu Java klašu komplekts, nevis apgrūtinošākais iepriekšējo versiju interfeisu un ieviešanas komplekts. Tādējādi mums ir mazāk ģenerētu klašu, kā arī vieglāks un elegantāks kods. Un, kā jūs redzēsiet nākamajā sadaļā, manipulēt ar šīm klasēm ir viegli.

XML dokumenta atcelšana

Atcelšana ir process, kā XML dokumentu pārveido par atbilstošu Java objektu kopu. JaXB 2.0 noņemšana ir vienkārša. Pirmkārt, jūs izveidojat JAXBContext konteksta objekts. Konteksta objekts ir sākumpunkts šķirošanas, atdalīšanas un apstiprināšanas darbībām. Šeit jūs norādāt Java pakotni, kurā ir jūsu JAXB kartētās klases:

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

Lai atceltu XML dokumentu, izveidojiet Unmarshaller no konteksta, kā parādīts šeit:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

The unmarshaller var apstrādāt XML datus no visdažādākajiem datu avotiem: failiem, ievades straumēm, URL, DOM objektiem, SAX parsētājiem un daudz ko citu. Šeit mēs piedāvājam vienkāršu Fails objekts, kas norāda uz mūsu XML dokumentu. The unmarhallhaller atgriež ierakstīto JAXBElement, no kura mēs varam iegūt savu nemarķēto objektu, izmantojot getValue () metode:

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

CourseBooking booking = bookingElement.getValue ();

Dokumenta apstiprināšana

Dokumenta pārbaude ir process, kas nodrošina, ka jūsu XML dokuments atbilst definīcijai, kas norādīta attiecīgajā XML shēmā. Tas ir svarīgs jebkura projekta aspekts, kurā iesaistītas XML apmaiņas, it īpaši, ja XML nāk no citām sistēmām. Dokumentu validācija JAXB 2.0 versijā ir vienkāršāka un elastīgāka nekā iepriekšējās versijās. Jūs varat vienkārši piestiprināt ValidatonEventHandler uz unmarhallhaller pirms XML dokumenta atcelšanas, kā parādīts šeit:

 unmarshaller.setEventHandler (jauns BookingValidationEventHandler ());

Apstiprināšanas notikumu apstrādātājs īsteno ValidationEventHandler interfeiss un handleEvent () metodi, kā parādīts šeit:

publiskā klase BookingValidationEventHandler īsteno ValidationEventHandler {

public Boolean handleEvent (ValidationEvent ve) {

if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator lokators = ve.getLocator (); // Drukāt ziņojumu no valdation event System.out.println ("Nederīgs rezervācijas dokuments:" + locator.getURL ()); System.out.println ("Kļūda:" + ve.getMessage ()); // Izejas rindas un kolonnas numurs System.out.println ("Kļūda kolonnā" + locator.getColumnNumber () + ", line" + locator.getLineNumber ()); } return true; }}

Šeit mēs vienkārši izdrukājam informāciju par kļūdu, taču reālā lietojumprogrammā varētu būt piemērota mazsvarīgāka attieksme. Dažos gadījumos jūs pat varat uzskatīt, ka validācijas kļūda nav aizbāznis un ka tā neaizkavēs apstrādi. Atgriežoties patiesu, jūs sakāt unmarhallhaller lai turpinātu atdalīšanas procesu: false, process tiktu izbeigts ar atbilstošu izņēmumu.

Dokumenta veidošana

Izšķiršana ietver Java klašu pārveidošanu XML formātā. JaXB 2.0 versijā šo Java klašu izveide un manipulēšana ir vienkārša. Vairumā gadījumu jūs varat vienkārši izturēties pret viņiem kā pret parastajām Java klasēm, kā parādīts šeit:

 CourseBooking booking = jauns CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (jauns BigDecimal (10000)); ...

Ņemiet vērā, ka joprojām varat izmantot ObjectFactory klase līdzīgi kā to izmantojāt JAXB 1.0 versijā, kā parādīts nākamajā sarakstā. Tomēr atšķirībā no JAXB 1.0 nav saskarņu vai ieviešanas klases: visi domēna objekti ir tikai JavaBeans komponenti ar anotācijām.

 Rūpnīca ObjectFactory = new ObjectFactory (); CourseBooking booking = factory.createCourseBooking (); ...

Lai gan lielākā daļa XML datu tipu tiek tieši pieskaitīti parastajām Java klasēm, dažiem datu tipiem, piemēram, datumiem, nepieciešama īpaša apstrāde. Šādos gadījumos jums jāizmanto DatatypeFactory, kā parādīts šeit:

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

Kad jūsu domēna objekts ir inicializēts, izmantojiet JAXB kontekstu, lai izveidotu Māršallers objekts un drukāts JAXBElement. Veidojot marshaller ir vienkārši:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Pēc tam jūs izveidojat JAXBElement objekts, kas iekapsulē jūsu domēna objektu. Rakstītās JAXBElement atbilst saknes elementam complexType XML dokumenta. Pēc tam izmantojiet ģenerēto ObjectFactory klase šādi:

 JAXBElement bookingElement = (new ObjectFactory ()). CreateBooking (rezervēšana);

Šajā piemērā mēs iestatām rekvizītu tā, lai izvade tiktu formatēta lietošanai cilvēkiem, un pēc tam ierakstiet standarta izvadē:

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

Šeit ir parādīts pilns koda paraugs:

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

CourseBooking booking = jauns CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (jauns BigDecimal (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory datu tipi = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (jauns BigDecimal (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (new StudentType ()); booking.getStudent (). get (0) .setFirstName ("Jānis"); booking.getStudent (). get (0) .setSurname ("Smits"); booking.setCompany (new CompanyType ()); booking.getCompany (). setName ("Klienti ieskaitot"); booking.getCompany (). setContact (jauns ContactType ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("10 klienta iela");

// Marshal to System.out Marshaller marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (new ObjectFactory ()). CreateBooking (rezervēšana); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal (bookingElement, System.out);

Palaidot šo kodu, tiks ģenerēts kaut kas līdzīgs šim:

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