Útmutató a JAXB-hez

1. Bemutatkozás

Ez egy bevezető cikk a JAXB-ről (Java Architecture for XML Binding).

Először megmutatjuk, hogyan lehet konvertálni a Java objektumokat XML-be és fordítva, majd a Java osztályok generálására összpontosítunk XML sémából és fordítva a JAXB-2 Maven plugin használatával.

2. Áttekintés

A JAXB gyors és kényelmes módot kínál a Java objektumok XML-be történő átírására (írása) és az XML objektumokba való fel nem olvasására (olvasása). Támogat egy olyan kötési keretrendszert, amely az XML elemeket és attribútumokat a Java mezőkhöz és tulajdonságokhoz hozzárendeli Java megjegyzések segítségével.

A JAXB-2 Maven plugin munkájának nagy részét a JDK által szállított két eszköz, az XJC és a Schemagen egyikére ruházza át.

3. JAXB kommentárok

A JAXB Java jelöléseket használ a generált osztályok további információkkal való kiegészítésére. Az ilyen kommentárok hozzáadása a meglévő Java osztályokhoz felkészíti őket a JAXB futásidejére.

Először hozzunk létre egy egyszerű Java objektumot a rendezés és a rendezés megszüntetése érdekében:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) public class Book {private Long id; privát karakterlánc neve; magánhúr-szerző; privát Dátum dátuma; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlElement (name = "title") public void setName (Karakterlánc neve) {this.name = név; } @XmlTransient public void setAuthor (String author) {this.author = author; } // kivitelező, mérőeszközök és beállítók}

A fenti osztály a következő jegyzeteket tartalmazza:

  • @XmlRootElement: a gyökér XML elem neve az osztály nevéből származik, és megadhatjuk az XML gyökér elem nevét is annak name attribútumával
  • @XmlType: adja meg a mezők sorrendjét az XML fájlban
  • @XmlElement: határozza meg a tényleges XML elem nevet, amelyet használni fog
  • @XmlAttribute: határozza meg, hogy az id mező attribútumként legyen leképezve elem helyett
  • @XmlTransient: jelölje meg azokat a mezőket, amelyeket nem akarunk bekapcsolni az XML-be

A JAXB annotációval kapcsolatos további részletekért érdemes megnéznie a következő linket.

4. Marshalling - Java objektum konvertálása XML formátumra

A Marshalling egy ügyfélalkalmazásnak lehetővé teszi a JAXB-ből származó Java objektumfa átalakítását XML-adatokká. Alapértelmezés szerint a Marshaller XML adatok előállításakor UTF-8 kódolást használ. Ezután Java objektumokból generálunk XML fájlokat.

Hozzunk létre egy egyszerű programot a JAXBContext amely absztraktot nyújt a JAXB összerendelési keretrendszer-műveletek végrehajtásához szükséges XML / Java összerendelési információk kezeléséhez:

public void marsall () dob JAXBException, IOException {Book book = new Book (); book.setId (1L); book.setName ("1. könyv"); book.setAuthor ("Szerző1"); book.setDate (új Dátum ()); JAXBContext context = JAXBContext.newInstance (Book.class); Marshaller mar = context.createMarshaller (); mar.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal (könyv, új File ("./ book.xml")); }

A javax.xml.bind.JAXBContext osztály biztosítja az ügyfél belépési pontját a JAXB API-hoz. Alapértelmezés szerint a JAXB nem formázza az XML dokumentumot. Ez helyet takarít meg, és megakadályozza, hogy a fehér tereket véletlenül jelentősnek értelmezzük.

A JAXB formátumú kimenethez egyszerűen be kell állítanunk a Marshaller.JAXB_FORMATTED_OUTPUT tulajdonhoz igaz a Marshaller. A marsall módszer egy objektumot és egy kimeneti fájlt használ, ahol a létrehozott XML-t paraméterként tárolhatja.

Amikor a fenti kódot futtatjuk, ellenőrizhetjük az eredményt a könyv.xml annak ellenőrzése, hogy sikeresen átalakítottuk-e a Java objektumot XML adatokká:

  1. könyv 2016-11-12T11: 25: 12.227 + 07: 00 

5. Nem rendezés - XML ​​konvertálása Java objektummá

A nem rendezés az ügyfélalkalmazásnak lehetővé teszi az XML adatok JAXB-ből származó Java objektumokká alakítását.

Használjuk a JAXB-t Unmarshaller hogy megszüntessük a marsallt könyv.xml vissza egy Java objektumra:

public book unmarshall () dobja a JAXBException, IOException {JAXBContext context = JAXBContext.newInstance (Book.class); return (könyv) context.createUnmarshaller () .unmarshal (új FileReader ("./ book.xml")); }

A fenti kód futtatásakor ellenőrizhetjük a konzol kimenetét annak ellenőrzésére, hogy az XML adatokat sikeresen konvertáltuk-e Java objektummá:

Könyv [id = 1, név = 1. könyv, szerző = null, dátum = szombat, nov. 12, 11:38:18, ICT 2016]

6. Összetett adattípusok

Olyan összetett adattípusok kezelésekor, amelyek nem biztos, hogy közvetlenül elérhetők a JAXB-ben, írhatunk egy illesztőt, amely jelzi a JAXB-nek, hogyan kell kezelni egy adott típust.

A JAXB-k használata XmlAdapter, definiálhatunk egy egyedi kódot egy leképezhetetlen osztály átalakítására olyasmire, amelyet a JAXB kezelni tud. A @XmlJavaTypeAdapter A kommentár olyan adaptert használ, amely kiterjeszti a XmlAdapter osztály egyéni marsallozásra.

Hozzunk létre egy adaptert a dátumformátum megadásához marsalloláskor:

public class DateAdapter kiterjeszti az XmlAdapter {private static final ThreadLocal dateFormat = new ThreadLocal () {@Orride protected DateFormat initialValue () {return new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); }}; @Orride public Date unmarshal (String v) dobja a Kivételt {return dateFormat.get (). Parse (v); } @Orride public String marsall (dátum v) dobja a Kivételt {return dateFormat.get (). Format (v); }}

Dátumformátumot használunkéééé-hh-nn HH: mm: ss" átalakít Dátum nak nek Húr rendezéskor és ThreadLocal hogy a mi Dátum formátum szálbiztos.

Alkalmazzuk a DateAdapter a miénknek Könyv:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) public class Book {private Long id; privát karakterlánc neve; magánhúr-szerző; privát Dátum dátuma; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlTransient public void setAuthor (String author) {this.author = author; } @XmlElement (name = "title") public void setName (Karakterlánc neve) {this.name = név; } @XmlJavaTypeAdapter (DateAdapter.class) public void setDate (Date date) {this.date = dátum; }}

Amikor a fenti kódot futtatjuk, ellenőrizhetjük az eredményt a könyv.xml annak ellenőrzése, hogy sikeresen átalakítottuk-e Java objektumunkat XML formátumba az új dátumformátum használatávaléééé-hh-nn HH: mm: ss“:

  1. könyv 2016-11-10 23: 44: 18döntő 

7. JAXB-2 Maven beépülő modul

Ez a bővítmény a Java API for XML Binding (JAXB) 2+ verzióját használja Java osztályok generálásához XML sémákból (és opcionálisan fájlok megkötéséből), vagy XML séma létrehozásához kommentált Java osztályból.

Ne feledje, hogy a webszolgáltatások felépítésének két alapvető megközelítése van, A szerződés utolsó és Először a szerződés. E megközelítésekről további részletekért érdemes megnéznie a következő linket.

7.1. Java osztály létrehozása XSD-ből

A JAXB-2 Maven plugin a JDK által szállított XJC eszközt használja, egy JAXB Binding fordító eszközt, amely Java osztályokat generál XSD-ből (XML Schema Definition).

Hozzunk létre egy egyszerű user.xsd fájlt, és a JAXB-2 Maven beépülő modul segítségével hozhat létre Java osztályokat ebből az XSD sémából:

Konfiguráljuk a JAXB-2 Maven plugint:

 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 

Alapértelmezés szerint ez a bővítmény az XSD fájlokat keresi meg src / main / xsd. Az XSD keresést úgy konfigurálhatjuk, hogy módosítjuk a bővítmény konfigurációs szakaszát a pom.xml Eszerint.

Alapértelmezés szerint ezeket a Java osztályokat a target / generated-resources / jaxb mappába. Megváltoztathatjuk a kimeneti könyvtárat egy an hozzáadásával kimeneti könyvtár elemet a plugin konfigurációjához. Hozzáadhatunk a clearOutputDir elem értéke hamis, hogy megakadályozza az ebben a könyvtárban található fájlok törlését.

Konfigurálhatunk egy globális JAXB-összerendelést is, amely felülírja az alapértelmezett összerendelési szabályokat:

A globális.xjb fent felülírja a dátum idő írja be a java.util.Naptár típus.

Amikor felépítjük a projektet, osztályfájlokat generál a src / main / java mappa és csomag com.baeldung.jaxb.gen.

7.2. XSD séma előállítása Java-ból

Ugyanez a bővítmény a JDK által biztosított eszközt használja Schemagen. Ez egy JAXB Binding fordító eszköz, amely XSD sémát generálhat Java osztályokból. Annak érdekében, hogy a Java osztály alkalmas legyen XSD sémajelöltre, az osztályt a-val kell jegyezni @XmlType annotáció.

Újra felhasználjuk az előző példa Java osztályfájljait. Konfiguráljuk a plugint:

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

Alapértelmezés szerint a JAXB az összes mappát átvizsgálja src / main / java rekurzívan az annotált JAXB osztályoknál. Megadhatunk mást forrás mappát a JAXB annotált osztályainkhoz a forrás elemet a plug-in konfigurációhoz.

Regisztrálhatunk a transformSchemas, az XSD séma elnevezéséért felelős utólagos feldolgozó. Úgy működik, hogy a névtér a névtérrel @XmlType Java osztályának.

A projekt felépítésekor a user-gen.xsd fájl a src / main / resources Könyvtár.

8. Következtetés

Ebben a cikkben a JAXB bevezető fogalmaival foglalkoztunk. Részletekért megnézhetjük a JAXB honlapját.

A cikk forráskódját a GitHubon találhatjuk meg.


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