Ú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.