Vodič za JAXB

1. Uvod

Ovo je uvodni članak o JAXB (Java arhitektura za XML vezanje).

Prvo ćemo pokazati kako pretvoriti Java objekte u XML i obratno, a zatim ćemo se usredotočiti na generiranje Java klasa iz XML sheme i obratno pomoću dodatka JAXB-2 Maven.

2. Pregled

JAXB pruža brz i prikladan način za pretvorbu (pisanje) Java objekata u XML i uklanjanje (čitanje) XML u objekte. Podržava okvir vezanja koji preslikava XML elemente i atribute na Java polja i svojstva pomoću Java napomena.

Dodatak JAXB-2 Maven delegira većinu svog posla na bilo koji od dva alata XJC i Schemagen koje isporučuje JDK.

3. JAXB napomene

JAXB koristi Java napomene za uvećavanje generiranih klasa s dodatnim informacijama. Dodavanjem takvih bilješki u postojeće Java klase priprema se za vrijeme izvođenja JAXB.

Napravimo najprije jednostavan Java objekt koji će ilustrirati raspodjelu i poništavanje raspodjele:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) javna klasa Book {private Long id; privatni naziv niza; privatni autor niza; privatni Datum datum; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlElement (name = "title") javna praznina setName (ime niza) {this.name = name; } @XmlTransient javna praznina setAuthor (autor niza) {this.author = author; } // konstruktor, getteri i postavljači}

Gornja klasa gore sadrži sljedeće bilješke:

  • @XmlRootElement: t Ime korijenskog XML elementa izvedeno je iz naziva klase, a također možemo odrediti ime korijenskog elementa XML-a koristeći njegov atribut name
  • @XmlType: definirajte redoslijed kojim se polja zapisuju u XML datoteku
  • @XmlElement: definirajte stvarno ime XML elementa koje će se koristiti
  • @XmlAttribute: definiraj polje id preslikava se kao atribut umjesto elementa
  • @XmlTransient: napomena polja koja ne želimo da budu uključena u XML

Za više detalja o JAXB bilješkama, možda ćete htjeti provjeriti sljedeću vezu.

4. Maršaliranje - pretvaranje Java objekta u XML

Marshalling klijentskoj aplikaciji omogućuje pretvaranje JAXB izvedenog Java stabla objekata u XML podatke. Prema zadanim postavkama Marshaller koristi UTF-8 kodiranje pri generiranju XML podataka. Dalje, generirat ćemo XML datoteke iz Java objekata.

Stvorimo jednostavan program pomoću JAXBContext koji pruža apstrakciju za upravljanje informacijama o XML / Java vezivanju potrebnim za provedbu operacija okvira za vezivanje JAXB:

public void marshal () baca JAXBException, IOException {Knjiga knjiga = nova Knjiga (); book.setId (1L); book.setName ("Knjiga1"); book.setAuthor ("Autor1"); book.setDate (novi datum ()); JAXBContext context = JAXBContext.newInstance (Book.class); Marshaller mar = context.createMarshaller (); mar.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal (knjiga, nova datoteka ("./ book.xml")); }

The javax.xml.bind.JAXBContext klasa pruža ulaznu točku klijenta u JAXB API. Prema zadanim postavkama, JAXB ne formatira XML dokument. To štedi prostor i sprječava da se bilo koji razmak slučajno može protumačiti kao značajan.

Da bi JAXB formatirao izlaz, jednostavno postavimo Marshaller.JAXB_FORMATTED_OUTPUT svojstvo da pravi na Marshaller. Metoda maršala koristi objekt i izlaznu datoteku gdje će generirani XML pohraniti kao parametre.

Kada pokrenemo gornji kod, možda ćemo provjeriti rezultat u knjiga.xml kako bismo potvrdili da uspješno pretvaramo Java objekt u XML podatke:

  Knjiga1 2016-11-12T11: 25: 12.227 + 07: 00 

5. Poništavanje ranžiranja - Pretvaranje XML-a u Java objekt

Poništavanje ranžiranja pruža klijentskoj aplikaciji mogućnost pretvaranja XML podataka u Java objekte izvedene iz JAXB-a.

Koristimo JAXB Unmaršaler da odmaršira naše knjiga.xml natrag na Java objekt:

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

Kada pokrenemo gornji kod, možemo provjeriti izlaz konzole kako bismo provjerili jesmo li uspješno pretvorili XML podatke u Java objekt:

Knjiga [id = 1, name = Book1, author = null, date = Sub 12. studenoga 11:38:18 ICT 2016]

6. Složeni tipovi podataka

Prilikom rukovanja složenim vrstama podataka koje možda nisu izravno dostupne u JAXB-u, možemo napisati adapter koji će naznačiti JAXB-u kako upravljati određenim tipom.

Koristeći JAXB-ove XmlAdapter, možemo definirati prilagođeni kôd za pretvaranje neupriličive klase u nešto što JAXB može obraditi. The @XmlJavaTypeAdapter napomena koristi adapter koji proširuje XmlAdapter razred za prilagođeno marširanje.

Stvorimo adapter za određivanje formata datuma prilikom marširanja:

javna klasa DateAdapter proširuje XmlAdapter {privatni statički konačni ThreadLocal dateFormat = new ThreadLocal () {@Override zaštićen DateFormat InitialValue () {return new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); }}; @Override public Date unmarshal (String v) baca izuzetak {return dateFormat.get (). Parse (v); } @Override public String maršal (Datum v) baca izuzetak {return dateFormat.get (). Format (v); }}

Koristimo format datuma “gggg-MM-dd VH: mm: ss”Pretvoriti Datum do Niz pri ranžiranju i ThreadLocal kako bi naš Oblik datuma bez niti.

Primijenimo DatumAdapter našem Knjiga:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) javna klasa Book {private Long id; privatni naziv niza; privatni autor niza; privatni Datum datum; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlTransient javna praznina setAuthor (autor niza) {this.author = author; } @XmlElement (name = "title") javna praznina setName (ime niza) {this.name = name; } @XmlJavaTypeAdapter (DateAdapter.class) javna praznina setDate (datum datum) {this.date = datum; }}

Kada pokrenemo gornji kod, možda ćemo provjeriti rezultat u knjiga.xml kako bismo provjerili je li naš Java objekt uspješno pretvorio u XML koristeći novi format datuma “gggg-MM-dd VH: mm: ss“:

  Knjiga1 2016-11-10 23: 44: 18finale 

7. Dodatak JAXB-2 Maven

Ovaj dodatak koristi Java API za vezanje XML-a (JAXB), verzija 2+, za generiranje Java klasa iz XML shema (i po želji obvezujućih datoteka) ili za stvaranje XML sheme iz označene Java klase.

Imajte na umu da postoje dva temeljna pristupa izradi web usluga, Ugovor zadnji i Prvo ugovor. Za više detalja o ovim pristupima, možda ćete htjeti provjeriti sljedeću vezu.

7.1. Generiranje Java klase iz XSD-a

Dodatak JAXB-2 Maven koristi alat XJC koji je isporučio JDK, alat za kompajliranje JAXB Bindinga koji generira Java klase iz XSD-a (definicija XML sheme).

Stvorimo jednostavan korisnik.xsd datoteku i upotrijebite dodatak JAXB-2 Maven za generiranje Java klasa iz ove XSD sheme:

Konfigurirajmo dodatak 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 

Prema zadanim postavkama ovaj dodatak locira XSD datoteke u src / main / xsd. Možemo konfigurirati XSD pretraživanje mijenjanjem odjeljka za konfiguraciju ovog dodatka u pom.xml prema tome.

Prema zadanim postavkama, ove se Java klase generiraju u cilj / generirani-resursi / jaxb mapu. Izlazni direktorij možemo promijeniti dodavanjem outputDirectory element u konfiguraciji dodatka. Možemo dodati i clearOutputDir element s vrijednosti false kako bi se spriječilo brisanje datoteka u ovom direktoriju.

Možemo također konfigurirati globalno vezivanje JAXB-a koje nadjačava zadana pravila vezivanja:

The global.xjb gore nadjačava Datum vrijeme utipkajte na java.util.Kalendar tip.

Kada gradimo projekt, on generira datoteke klase u src / main / java mapa i paket com.baeldung.jaxb.gen.

7.2. Generiranje XSD sheme iz Jave

Isti dodatak koristi alat isporučen s JDK Šemagen. Ovo je alat za kompajliranje JAXB Binding koji može generirati XSD shemu iz Java klasa. Da bi Java klasa ispunjavala uvjete za kandidata XSD sheme, klasa mora biti označena znakom @XmlType bilješka.

Ponovno koristimo datoteke klase Java iz prethodnog primjera. Konfigurirajmo dodatak:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 shemagen schemagen src / main / java / com / baeldung / jaxb / gen src / main / resources false / jaxb / gen user user-gen.xsd 

Prema zadanim postavkama JAXB skenira sve mape pod src / main / java rekurzivno za komentirane JAXB klase. Možemo navesti drugačije izvor mapa za naše JAXB označene klase dodavanjem a izvor element u konfiguraciji dodatka.

Također možemo registrirati a transformiraj sheme, naknadni procesor odgovoran za imenovanje XSD sheme. Djeluje podudaranjem prostor imena s prostorom imena @XmlType vašeg Java razreda.

Kada gradimo projekt, on generira a user-gen.xsd datoteku u src / glavni / resursi imenik.

8. Zaključak

U ovom smo članku pokrili uvodne koncepte o JAXB-u. Za detalje možemo pogledati početnu stranicu JAXB-a.

Izvorni kod za ovaj članak možemo pronaći na GitHubu.


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