Dátumok feloldása a JAXB használatával

1. Bemutatkozás

Ebben az oktatóanyagban Meg fogjuk nézni, hogyan lehet a JAXB használatával különféle formátumú objektumokat eldönteni.

Először kitérünk az alapértelmezett séma dátumformátumra. Ezután megvizsgáljuk a különböző formátumok használatát. Meglátjuk azt is, hogyan tudjuk kezelni az ilyen technikákkal felmerülő közös kihívást.

2. Séma Java-kötéshez

Első, meg kell értenünk az XML séma és a Java adattípusok kapcsolatát. Különösen az XML séma és a Java dátumobjektumok leképezése érdekel minket.

Szerint a Séma-Java leképezés, három Séma adattípus létezik, amelyeket figyelembe kell vennünk: xsd: dátum, xsd: idő és xsd: dateTime. Mint láthatjuk, mindegyikük fel van térképezve javax.xml.datatype.XMLGregorianCalendar.

Meg kell értenünk ezen XML séma típusok alapértelmezett formátumát is. A xsd: dátum és xsd: idő az adattípusokÉÉÉÉ-HH-NN ” és „óó: pp: ss ” formátumok. A xsd: dateTime formátum:ÉÉÉÉ-HH-NNTóó: pp: ss ” hol "T ” az időszak kezdetét jelző elválasztó.

3. Az alapértelmezett séma dátumformátumának használata

Fogunk építeni egy példát arra, hogy az unmarshals objektumokat dátumoz. Koncentráljunk a xsd: dateTime adattípus, mert ez a többi típus szuperhalmaza.

Használjunk egy egyszerű XML fájlt, amely leírja a könyvet:

 1. könyv 1979-10-21T03: 31: 12 

A fájlt a megfelelő Java-hoz akarjuk feltérképezni Könyv tárgy:

@XmlRootElement (name = "book") public class Book {@XmlElement (name = "title", required = true) private String title; @XmlElement (név = "közzétett", kötelező = igaz) privát XMLGregorianCalendar megjelent; @Orride public String toString () {return "[title:" + title + "; published:" + published.toString () + "]"; }}

Végül létre kell hoznunk egy kliens alkalmazást, amely az XML adatokat JAXB-ből származó Java objektumokká alakítja:

public static Book unmarshalDates (InputStream inputFile) dobja a JAXBException {JAXBContext jaxbContext = JAXBContext.newInstance (Book.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); return (könyv) jaxbUnmarshaller.unmarshal (inputFile); }

A fenti kódban meghatároztuk a JAXBContext amely a JAXB API belépési pontja. Ezután JAXB-t használtunk Unmarshaller egy bemeneti adatfolyamon az objektumunk olvasása érdekében:

Ha futtatjuk a fenti kódot és kinyomtatjuk az eredményt, a következőket kapjuk Könyv tárgy:

[cím: 1. könyv; közzétéve: 1979-11-28T02: 31: 32]

Meg kell jegyeznünk, hogy annak ellenére, hogy a xsd: dateTime az a XMLGregorianCalendar, használhatnánk a gyakoribb Java típusokat is: java.util.Dátum és java.util.Naptár, a JAXB felhasználói útmutatója szerint.

4. Egyéni dátumformátum használata

A fenti példa azért működik, mert az alapértelmezett séma dátumformátumot használjuk, „ÉÉÉÉ-HH-NNTóó: pp: ss”.

De mi van, ha egy másik formátumot akarunk használni, például „ÉÉÉÉ-HH-NN óó: pp: ss”, megszabadulni a „T” határoló? Ha az elválasztót helyettesítővel helyettesítenénk az XML fájlunkban, az alapértelmezett feloldás meghiúsulna.

4.1. Custom létrehozása XmlAdapter

Egy másik dátumformátum használatához meg kell határoznunk egy XmlAdapter.

Lássuk azt is, hogyan térképezzük fel a képet xsd: dateTime írja be a java.util.Dátum objektumot szokásunkkal XmlAdapter:

public class DateAdapter kiterjeszti az XmlAdapter {private static final String CUSTOM_FORMAT_STRING = "éééé-HH-NN ÓÓ: mm: ss"; @Orride public string string (date v) {return new SimpleDateFormat (CUSTOM_FORMAT_STRING) .format (v); } @Orride public Date unmarshal (String v) dobja a ParseException {return new SimpleDateFormat (CUSTOM_FORMAT_STRING) .parse (v); }}

Ebben az adapterben használtukSimpleDateFormat hogy formázzuk a dátumunkat. Vigyáznunk kell a SimpleDateFormat nem menetes. Annak elkerülése érdekében, hogy több szál problémát tapasztaljon egy megosztottal SimpleDateFormat objektumot, minden alkalommal létrehozunk egy újat, amikor szükségünk van rá.

4.2. A XmlAdapter’S belső

Mint láthatjuk, a XmlAdapter két típusú paramétere van, ebben az esetben, Húr és Dátum. Az első az XML-ben használt típus, amelyet értéktípusnak hívnak. Ebben az esetben a JAXB tudja, hogyan lehet XML értéket konvertálni a-vá Húr. A másodikat kötött típusnak hívjuk, és a Java objektumunk értékére vonatkozik.

Az adapter célja az értéktípus és a kötött típus közötti átalakítás, oly módon, amelyet a JAXB alapértelmezés szerint nem tud megtenni.

Egy szokás felépítése érdekében XmlAdapter, két módszert kell felülírnunk: XmlAdapter.marshal () és XmlAdapter.unmarshal ().

A szétválasztás során a JAXB összerendelési keretrendszer először az XML reprezentációt szünteti meg Húr majd felszólít DateAdapter.unmarshal () hogy az értéktípust a Dátum. A rendezés során a JAXB kötőkeret meghív DateAdapter.marshal () alkalmazkodni a Dátum nak nek Húr, amelyet aztán XML-ábrázolássá alakítanak át.

4.3. Integrálás a JAXB kommentárokon keresztül

A DateAdapter pluginként működik a JAXB-nél, és a dátummezőhöz csatoljuk a @XmlJavaTypeAdapter annotáció. A @XmlJavaTypeAdapteAz r annotáció meghatározza az an használatát XmlAdapter egyedi bontáshoz:

@XmlRootElement (name = "book") public class BookDateAdapter {// ugyanaz, mint korábban @XmlElement (name = "published", required = true) @XmlJavaTypeAdapter (DateAdapter.class) private Közzététel dátuma; // ugyanaz, mint korábban}

A szokásos JAXB kommentárokat is használjuk: @XmlRootElement és @XmlElement annotációk.

Végül futtassuk az új kódot:

[cím: 1. könyv; közzétéve: 1979. november 28., 02:31:32 EET]

5. A dátumok kibontása a Java 8-ban

A Java 8 bemutatott egy újat Dátum idő API. Itt a következőkre fogunk koncentrálni LocalDateTime osztály, amely az egyik leggyakrabban használt.

5.1. Épület a LocalDateTime-alapú XmlAdapter

Alapértelmezés szerint, A JAXB nem képes automatikusan lekötni egy xsd: dateTime érték a LocalDateTime objektum a dátum formátumától függetlenül. Az XML séma dátumértékének a-ba történő konvertálásához LocalDateTime objektumot, meg kell határoznunk egy másikat XmlAdapter hasonló az előzőhöz:

public class LocalDateTimeAdapter kiterjeszti az XmlAdapter {private DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern ("éééé-HH-nn HH: mm: ss"); @Orride public String marsall (LocalDateTime dateTime) {return dateTime.format (dateFormat); } @Orride public LocalDateTime unmarshal (String dateTime) {return LocalDateTime.parse (dateTime, dateFormat); }}

Ebben az esetben, használtuk a DateTimeFormatter a helyett SimpleDateFormat. Az előbbit a Java 8-ban mutatták be, és kompatibilis az újjal Dátum idő API.

Vegye figyelembe, hogy a konverziós műveletek megoszthatják a DateTimeFormatter tárgy, mert a DateTimeFormatter menetbiztos.

5.2. Az új adapter integrálása

Most cseréljük le a régi adaptert az újra Könyv osztály és szintén Dátum val vel LocalDateTime:

@XmlRootElement (name = "book") public class BookLocalDateTimeAdapter {// ugyanaz, mint korábban @XmlElement (name = "published", required = true) @XmlJavaTypeAdapter (LocalDateTimeAdapter.class) private LocalDateTime published; // ugyanaz, mint korábban}

Ha futtatjuk a fenti kódot, megkapjuk a kimenetet:

[cím: 1. könyv; közzétéve: 1979-11-28T02: 31: 32]

Vegye figyelembe, hogy a LocalDateTime.toString () hozzáteszi a „T” határoló a dátum és az idő között.

6. Következtetés

Ebben az oktatóanyagban feltártuk dátumok visszavonása a JAXB használatával.

Először megvizsgáltuk az XML séma és Java adattípus leképezést, és létrehoztunk egy példát az alapértelmezett XML séma dátumformátum használatával.

Ezután megtanultuk, hogyan kell használni az egyedi dátumformátumot egy egyéni alapján XmlAdapter és látta, hogyan kell kezelni a menet biztonságát SimpleDateFormat.

Végül kihangsúlyoztuk a kiváló, szálbiztos Java 8 Date / Time API-t és a nem kiosztott dátumokat egyéni formátumokkal.

Mint mindig, az oktatóanyagban használt forráskód is elérhető a GitHubon.


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