Guide til JAXB

1. Introduktion

Dette er en indledende artikel om JAXB (Java Architecture for XML Binding).

Først viser vi, hvordan man konverterer Java-objekter til XML og omvendt, og derefter fokuserer vi på at generere Java-klasser fra XML-skema og omvendt ved hjælp af JAXB-2 Maven-plugin.

2. Oversigt

JAXB giver en hurtig og bekvem måde at marshalere (skrive) Java-objekter til XML og un-marshal (læse) XML til objekter. Det understøtter en bindende ramme, der kortlægger XML-elementer og attributter til Java-felter og egenskaber ved hjælp af Java-kommentarer.

JAXB-2 Maven-pluginet delegerer det meste af sit arbejde til et af de to JDK-leverede værktøjer XJC og Schemagen.

3. JAXB-kommentarer

JAXB bruger Java-kommentarer til at udvide de genererede klasser med yderligere oplysninger. Tilføjelse af sådanne kommentarer til eksisterende Java-klasser forbereder dem til JAXB-runtime.

Lad os først oprette et simpelt Java-objekt til at illustrere marshalling og un-marshalling:

@XmlRootElement (navn = "bog") @XmlType (propOrder = {"id", "navn", "dato"}) offentlig klasse Bog {privat Lang id; privat strengnavn; privat strengforfatter; privat Dato dato; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlElement (name = "title") public void setName (String name) {this.name = name; } @XmlTransient offentlig ugyldighed setAuthor (strengforfatter) {this.author = author; } // konstruktør, getters og setters}

Ovenstående klasse ovenfor indeholder følgende kommentarer:

  • @XmlRootElement: t navnet på rod-XML-elementet er afledt af klassens navn, og vi kan også specificere navnet på rodelementet i XML ved hjælp af dets navneattribut
  • @XmlType: definer rækkefølgen, hvor felterne skrives i XML-filen
  • @XmlElement: definer det aktuelle XML-elementnavn, der skal bruges
  • @XmlAttribut: definer id-feltet er kortlagt som en attribut i stedet for et element
  • @XmlTransient: kommentere felter, som vi ikke ønsker at blive inkluderet i XML

For flere detaljer om JAXB-annotering, kan du tjekke følgende link.

4. Marshalling - Konvertering af Java-objekt til XML

Marshalling giver en klientapplikation mulighed for at konvertere et JAXB-afledt Java-objekttræ til XML-data. Som standard er Marshaller bruger UTF-8-kodning ved generering af XML-data. Derefter genererer vi XML-filer fra Java-objekter.

Lad os oprette et simpelt program ved hjælp af JAXBContext som giver en abstraktion til styring af de XML / Java-bindingsoplysninger, der er nødvendige for at implementere JAXB-bindende rammefunktioner:

offentlig ugyldig marskal () kaster JAXBException, IOException {Bogbog = ny bog (); book.setId (1L); book.setName ("Book1"); book.setAuthor ("Forfatter1"); book.setDate (ny dato ()); JAXBContext context = JAXBContext.newInstance (Book.class); Marshaller mar = context.createMarshaller (); mar.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal (bog, ny fil ("./ book.xml")); }

Det javax.xml.bind.JAXBContext klasse giver en klients indgang til JAXB API. Som standard formaterer JAXB ikke XML-dokumentet. Dette sparer plads og forhindrer, at ethvert hvidt rum ved et uheld kan tolkes som væsentligt.

For at få JAXB til at formatere output skal vi blot indstille Marshaller.JAXB_FORMATTED_OUTPUT ejendom til rigtigt på den Marshaller. Marshal-metoden bruger et objekt og en outputfil, hvor den genererede XML skal gemmes som parametre.

Når vi kører koden ovenfor, kan vi kontrollere resultatet i book.xml for at kontrollere, at vi med succes konverterer Java-objekt til XML-data:

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

5. Un-marshalling - Konvertering af XML til Java-objekt

Un-marshalling giver en klientapplikation mulighed for at konvertere XML-data til JAXB-afledte Java-objekter.

Lad os bruge JAXB Unmarshaller at afskaffe vores book.xml tilbage til et Java-objekt:

public Book unmarshall () kaster JAXBException, IOException {JAXBContext context = JAXBContext.newInstance (Book.class); returner (Bog) context.createUnmarshaller () .unmarshal (ny FileReader ("./ book.xml")); }

Når vi kører koden ovenfor, kan vi kontrollere konsoludgangen for at bekræfte, at vi med succes har konverteret XML-data til et Java-objekt:

Bog [id = 1, navn = Book1, forfatter = null, dato = lør nov 12 11:38:18 IKT 2016]

6. Komplekse datatyper

Når vi håndterer komplekse datatyper, som muligvis ikke er direkte tilgængelige i JAXB, kan vi skrive en adapter for at indikere JAXB, hvordan man administrerer en bestemt type.

Brug af JAXB'er Xml-adapter, kan vi definere en brugerdefineret kode til at konvertere en klasse, der ikke kan omstilles til noget, som JAXB kan håndtere. Det @XmlJavaTypeAdapter annotation bruger en adapter, der udvider Xml-adapter klasse til brugerdefineret marshaling.

Lad os oprette en adapter til at specificere et datoformat ved marshaling:

offentlig klasse DateAdapter udvider XmlAdapter {privat statisk endelig ThreadLocal dateFormat = ny ThreadLocal () {@Override beskyttet DateFormat initialValue () {returner SimpleDateFormat ("åååå-MM-dd HH: mm: ss"); }}; @ Override public Dato unmarshal (String v) kaster Undtagelse {return dateFormat.get (). Parse (v); } @ Override public String marshal (Date v) throw Exception {return dateFormat.get (). Format (v); }}

Vi bruger et datoformat “åååå-MM-dd HH: mm: ss" at konvertere Dato til Snor når du rangerer og Trådlokal at gøre vores Datoformat trådsikker.

Lad os anvende Datoadapter til vores Bestil:

@XmlRootElement (navn = "bog") @XmlType (propOrder = {"id", "navn", "dato"}) offentlig klasse Bog {privat Lang id; privat strengnavn; privat strengforfatter; privat Dato dato; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlTransient offentlig ugyldighed setAuthor (strengforfatter) {this.author = author; } @XmlElement (name = "title") public void setName (String name) {this.name = name; } @XmlJavaTypeAdapter (DateAdapter.class) public void setDate (Date date) {this.date = date; }}

Når vi kører koden ovenfor, kan vi kontrollere resultatet i book.xml for at kontrollere, at vi med succes har konverteret vores Java-objekt til XML ved hjælp af det nye datoformat “åååå-MM-dd HH: mm: ss“:

  Bog1 2016-11-10 23: 44: 18final 

7. JAXB-2 Maven-plugin

Dette plugin bruger Java API til XML Binding (JAXB), version 2+, til at generere Java-klasser fra XML-skemaer (og eventuelt bindende filer) eller til at oprette XML-skema ud fra en kommenteret Java-klasse.

Bemærk, at der er to grundlæggende tilgange til opbygning af webservices, Kontrakt sidst og Kontrakt først. For flere detaljer om disse tilgange, kan du tjekke følgende link.

7.1. Generering af en Java-klasse fra XSD

JAXB-2 Maven-pluginet bruger det JDK-leverede værktøj XJC, et JAXB-bindende kompilatorværktøj, der genererer Java-klasser fra XSD (XML Schema Definition).

Lad os oprette en simpel bruger.xsd fil og brug JAXB-2 Maven-pluginet til at generere Java-klasser fra dette XSD-skema:

Lad os konfigurere JAXB-2 Maven-pluginet:

 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 

Som standard finder dette plugin XSD-filer i src / main / xsd. Vi kan konfigurere XSD-opslag ved at ændre konfigurationsafsnittet for dette plugin i pom.xml derfor.

Disse Java-klasser genereres som standard i mål / genererede ressourcer / jaxb folder. Vi kan ændre outputmappen ved at tilføje en outputDirectory element til plugin-konfigurationen. Vi kan også tilføje en clearOutputDir element med værdien falsk for at forhindre filerne i denne mappe i at blive slettet.

Vi kan også konfigurere en global JAXB-binding, der tilsidesætter standardbindingsreglerne:

Det global.xjb ovenfor tilsidesætter dato tid skriv til java.util.Kalender type.

Når vi bygger projektet, genererer det klassefiler i src / main / java mappe og pakke com.baeldung.jaxb.gen.

7.2. Genererer XSD-skema fra Java

Det samme plugin bruger det JDK-leverede værktøj Schemagen. Dette er et JAXB-bindende kompilatorværktøj, der kan generere et XSD-skema fra Java-klasser. For at en Java-klasse skal være berettiget til en XSD-skemakandidat, skal klassen annoteres med en @XmlType kommentar.

Vi genbruger Java-klassefiler fra det foregående eksempel. Lad os konfigurere pluginet:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 skematisk skema src / main / java / com / baeldung / jaxb / gen src / main / ressourcer falsk / jaxb / gen bruger bruger-gen.xsd 

Som standard scanner JAXB alle mapper under src / main / java rekursivt til annoterede JAXB-klasser. Vi kan specificere en anden kilde mappe til vores JAXB-kommenterede klasser ved at tilføje en kilde element til plugin-konfigurationen.

Vi kan også registrere en transformSchemas, en postprocessor, der er ansvarlig for navngivning af XSD-skemaet. Det fungerer ved at matche navneområde med navneområdet for @XmlType af din Java-klasse.

Når vi bygger projektet, genererer det et brugergen.xsd fil i src / main / ressourcer vejviser.

8. Konklusion

I denne artikel dækkede vi introduktionskoncepter på JAXB. For detaljer kan vi se på JAXB-hjemmesiden.

Vi kan finde kildekoden til denne artikel på GitHub.