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 ekte på Marshaller. 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.