Guide til JAXB

1. Introduksjon

Dette er en innledende artikkel om JAXB (Java Architecture for XML Binding).

Først viser vi hvordan du konverterer Java-objekter til XML og omvendt, og deretter fokuserer vi på å generere Java-klasser fra XML-skjema og omvendt ved hjelp av JAXB-2 Maven-plugin.

2. Oversikt

JAXB gir en rask og praktisk måte å marshalere (skrive) Java-objekter til XML og un-marshal (lese) XML til objekter. Den støtter et bindende rammeverk som kartlegger XML-elementer og attributter til Java-felt og egenskaper ved hjelp av Java-merknader.

JAXB-2 Maven-pluginet delegerer det meste av sitt arbeid til et av de to JDK-leverte verktøyene XJC og Schemagen.

3. JAXB-merknader

JAXB bruker Java-merknader for å utvide de genererte klassene med tilleggsinformasjon. Å legge til slike merknader i eksisterende Java-klasser forbereder dem på JAXB-kjøretiden.

La oss først lage et enkelt Java-objekt for å illustrere marshalling og un-marshalling:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) public class Book {private Long id; privat strengnavn; privat strengforfatter; privat dato dato; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlElement (name = "title") public void setName (strengnavn) {this.name = name; } @XmlTransient public void setAuthor (strengforfatter) {this.author = author; } // konstruktør, getters og setters}

Ovennevnte klasse ovenfor inneholder følgende kommentarer:

  • @XmlRootElement: t navnet på XML-elementet er avledet fra klassenavnet, og vi kan også spesifisere navnet på rotelementet til XML ved hjelp av navnattributtet
  • @XmlType: definer rekkefølgen feltene skal skrives i XML-filen
  • @XmlElement: definer det faktiske XML-elementnavnet som skal brukes
  • @XmlAttributt: definer id-feltet er kartlagt som et attributt i stedet for et element
  • @XmlTransient: kommentere felt som vi ikke ønsker å bli inkludert i XML

For mer informasjon om JAXB-merknader, kan du sjekke ut følgende lenke.

4. Marshalling - Konvertering av Java-objekt til XML

Marshalling gir et klientprogram muligheten til å konvertere et JAXB-avledet Java-objekttre til XML-data. Som standard er Marshaller bruker UTF-8-koding når den genererer XML-data. Deretter genererer vi XML-filer fra Java-objekter.

La oss lage et enkelt program ved hjelp av JAXBContext som gir en abstraksjon for å administrere XML / Java-bindingsinformasjonen som er nødvendig for å implementere JAXB-bindende rammeverkoperasjoner:

offentlig ugyldig marshal () kaster JAXBException, IOException {Book book = new Book (); 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 (bok, ny fil ("./ book.xml")); }

De javax.xml.bind.JAXBContext klasse gir klientens inngangspunkt til JAXB API. Som standard formaterer ikke JAXB XML-dokumentet. Dette sparer plass og forhindrer at hvite mellomrom ved et uhell kan tolkes som vesentlige.

For å få JAXB til å formatere utdataene, stiller vi bare inn Marshaller.JAXB_FORMATTED_OUTPUT eiendom til ekteMarshaller. Marshal-metoden bruker et objekt og en utdatafil der den genererte XML skal lagres som parametere.

Når vi kjører koden ovenfor, kan vi sjekke resultatet i book.xml for å bekrefte at vi lykkes med å konvertere Java-objekt til XML-data:

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

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

Un-marshalling gir et klientprogram muligheten til å konvertere XML-data til JAXB-avledede Java-objekter.

La oss bruke JAXB Unmarshaller å un-marshal vår book.xml tilbake til et Java-objekt:

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

Når vi kjører koden ovenfor, kan vi sjekke konsollutgangen for å bekrefte at vi har konvertert XML-data til et Java-objekt:

Bok [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 kanskje ikke er direkte tilgjengelige i JAXB, kan vi skrive et adapter for å indikere JAXB hvordan du administrerer en bestemt type.

Bruker JAXB XmlAdapter, kan vi definere en egendefinert kode for å konvertere en ukjennelig klasse til noe som JAXB kan håndtere. De @XmlJavaTypeAdapter merknader bruker en adapter som utvider XmlAdapter klasse for tilpasset marshaling.

La oss lage en adapter for å spesifisere et datoformat når du marshalerer:

public class DateAdapter utvider XmlAdapter {private static final ThreadLocal dateFormat = new ThreadLocal () {@Override protected DateFormat initialValue () {return new SimpleDateFormat ("åååå-MM-dd HH: mm: ss"); }}; @ Override public Date unmarshal (String v) kaster Unntak {return dateFormat.get (). Parse (v); } @ Override public String marshal (Date v) throw Exception {return dateFormat.get (). Format (v); }}

Vi bruker et datoformat “åååå-MM-dd HH: mm: ss" å konvertere Dato til String ved marshalling og Trådlokal å gjøre vårt DateFormat trådsikker.

La oss bruke Datoadapter til vår Bok:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) public class Book {private Long id; privat strengnavn; privat strengforfatter; privat dato dato; @XmlAttribute public void setId (Long id) {this.id = id; } @XmlTransient public void 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 kjører koden ovenfor, kan vi sjekke resultatet i book.xml for å bekrefte at vi har konvertert Java-objektet vårt til XML ved hjelp av det nye datoformatet “åååå-MM-dd HH: mm: ss“:

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

7. JAXB-2 Maven-plugin

Dette pluginet bruker Java API for XML Binding (JAXB), versjon 2+, for å generere Java-klasser fra XML-skjemaer (og eventuelt bindende filer) eller for å opprette XML-skjema fra en kommentert Java-klasse.

Merk at det er to grunnleggende tilnærminger til å bygge webtjenester, Kontrakt sist og Kontrakt først. For mer informasjon om disse tilnærmingene, kan du sjekke ut følgende lenke.

7.1. Genererer en Java-klasse fra XSD

JAXB-2 Maven-pluginet bruker det JDK-leverte verktøyet XJC, et JAXB Binding-kompilatorverktøy som genererer Java-klasser fra XSD (XML Schema Definition).

La oss lage en enkel bruker.xsd fil og bruk JAXB-2 Maven-plugin for å generere Java-klasser fra dette XSD-skjemaet:

La oss 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 finner dette pluginet XSD-filer i src / main / xsd. Vi kan konfigurere XSD-oppslag ved å endre konfigurasjonsdelen av dette pluginet i pom.xml tilsvarende.

Som standard genereres disse Java-klassene i mål / genererte ressurser / jaxb mappe. Vi kan endre utdatakatalogen ved å legge til en outputDirectory element til plugin-konfigurasjonen. Vi kan også legge til en clearOutputDir element med en verdi på false for å forhindre at filene i denne katalogen blir slettet.

Vi kan også konfigurere en global JAXB-binding som overstyrer standard bindingsregler:

De global.xjb ovenfor overstyrer dato tid skriv til java.util.Kalender type.

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

7.2. Genererer XSD-skjema fra Java

Samme plugin bruker det JDK-leverte verktøyet Schemagen. Dette er et JAXB Binding kompilatorverktøy som kan generere et XSD-skjema fra Java-klasser. For at en Java-klasse skal være kvalifisert for en XSD-skjemakandidat, må klassen merkes med en @XmlType kommentar.

Vi gjenbruker Java-klassefilene fra forrige eksempel. La oss konfigurere plugin:

 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 

Som standard skanner JAXB alle mappene under src / main / java rekursivt for merkede JAXB-klasser. Vi kan spesifisere et annet kilde mappe for JAXB-merkede klasser ved å legge til en kilde elementet til plugin-konfigurasjonen.

Vi kan også registrere en transformSchemas, en postbehandler som er ansvarlig for å navngi XSD-skjemaet. Det fungerer ved å matche navneområdet med navneområdet til @XmlType av Java-klassen din.

Når vi bygger prosjektet, genererer det et brukergen.xsd filen i src / main / resources katalog.

8. Konklusjon

I denne artikkelen dekket vi innledende konsepter på JAXB. For detaljer kan vi ta en titt på JAXB-hjemmesiden.

Vi finner kildekoden for denne artikkelen på GitHub.


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