Panduan untuk JAXB

1. Pengenalan

Ini adalah artikel pengenalan mengenai JAXB (Java Architecture for XML Binding).

Pertama, kita akan menunjukkan cara menukar objek Java ke XML dan sebaliknya, dan kemudian kita akan menumpukan pada menghasilkan kelas Java dari skema XML dan sebaliknya dengan menggunakan plugin JAXB-2 Maven.

2. Gambaran keseluruhan

JAXB menyediakan cara cepat dan mudah untuk marshal (menulis) objek Java menjadi XML dan un-marshal (baca) XML menjadi objek. Ini mendukung kerangka kerja mengikat yang memetakan elemen dan atribut XML ke bidang dan sifat Java menggunakan anotasi Java.

Plugin JAXB-2 Maven menyerahkan sebahagian besar kerjanya ke salah satu daripada dua alat yang dibekalkan JDK XJC dan Schemagen.

3. Anotasi JAXB

JAXB menggunakan anotasi Java untuk menambah kelas yang dihasilkan dengan maklumat tambahan. Menambah anotasi seperti itu ke kelas Java yang ada menyiapkannya untuk jangka masa JAXB.

Mari buat objek Java sederhana untuk menggambarkan marshalling dan un-marshalling:

@XmlRootElement(name = "book") @XmlType(propOrder = { "id", "name", "date" }) public class Book { private Long id; private String name; private String author; private Date date; @XmlAttribute public void setId(Long id) { this.id = id; } @XmlElement(name = "title") public void setName(String name) { this.name = name; } @XmlTransient public void setAuthor(String author) { this.author = author; } // constructor, getters and setters }

Kelas di atas mengandungi anotasi berikut:

  • @XmlRootElement : t dia nama elemen XML akar berasal dari nama kelas dan kita juga dapat menentukan nama elemen akar XML menggunakan atribut namanya
  • @XmlType : tentukan urutan di mana bidang ditulis dalam fail XML
  • @XmlElement : tentukan nama elemen XML sebenar yang akan digunakan
  • @XmlAttribute : menentukan medan id dipetakan sebagai atribut dan bukannya elemen
  • @XmlTransient : beri anotasi bidang yang kami tidak mahu disertakan dalam XML

Untuk maklumat lebih lanjut mengenai penjelasan JAXB, anda mungkin ingin melihat pautan berikut.

4. Marshalling - Menukar Objek Java ke XML

Marshalling menyediakan aplikasi klien kemampuan untuk mengubah pohon objek Java yang berasal dari JAXB menjadi data XML. Secara lalai, Marshaller menggunakan pengekodan UTF-8 ketika menghasilkan data XML. Seterusnya, kami akan menghasilkan fail XML dari objek Java.

Mari buat program mudah menggunakan JAXBContext yang memberikan abstraksi untuk menguruskan maklumat mengikat XML / Java yang diperlukan untuk melaksanakan operasi kerangka pengikat JAXB:

public void marshal() throws JAXBException, IOException { Book book = new Book(); book.setId(1L); book.setName("Book1"); book.setAuthor("Author1"); book.setDate(new Date()); JAXBContext context = JAXBContext.newInstance(Book.class); Marshaller mar= context.createMarshaller(); mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); mar.marshal(book, new File("./book.xml")); }

The javax.xml.bind.JAXBContext kelas menyediakan pintu masuk yang pelanggan untuk JAXB API. Secara lalai, JAXB tidak memformat dokumen XML. Ini menjimatkan ruang dan mencegah bahawa ruang putih mana pun secara tidak sengaja dapat ditafsirkan sebagai signifikan.

Untuk memformat output JAXB, kita cukup menetapkan harta Marshaller.JAXB_FORMATTED_OUTPUT menjadi benar di Marshaller . Kaedah marshal menggunakan objek dan fail output untuk menyimpan XML yang dihasilkan sebagai parameter.

Apabila kita menjalankan kod di atas, kita mungkin memeriksa hasilnya di book.xml untuk mengesahkan bahawa kita berjaya menukar objek Java menjadi data XML:

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

5. Un-marshalling - Menukar XML ke Objek Java

Un-marshalling menyediakan aplikasi klien kemampuan untuk mengubah data XML menjadi objek Java yang berasal dari JAXB.

Mari gunakan JAXB Unmarshaller untuk membongkar kembali buku kami.xml kembali ke objek Java:

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

Apabila kita menjalankan kod di atas, kita mungkin memeriksa output konsol untuk mengesahkan bahawa kita berjaya menukar data XML menjadi objek Java:

Book [id=1, name=Book1, author=null, date=Sat Nov 12 11:38:18 ICT 2016]

6. Jenis Data yang Kompleks

Semasa menangani jenis data kompleks yang mungkin tidak tersedia secara langsung di JAXB, kami mungkin menulis penyesuai untuk menunjukkan JAXB cara menguruskan jenis tertentu.

Dengan menggunakan XmlAdapter JAXB , kami dapat menentukan kod tersuai untuk menukar kelas yang tidak dapat dilaksanakan menjadi sesuatu yang dapat ditangani oleh JAXB. The @XmlJavaTypeAdapter anotasi menggunakan penyesuai yang memanjangkan XmlAdapter kelas bagi marshaling adat.

Mari buat penyesuai untuk menentukan format tarikh semasa marshaling:

public class DateAdapter extends XmlAdapter { private static final ThreadLocal dateFormat = new ThreadLocal() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; @Override public Date unmarshal(String v) throws Exception { return dateFormat.get().parse(v); } @Override public String marshal(Date v) throws Exception { return dateFormat.get().format(v); } }

Kami menggunakan "format tarikh HH yyyy-mm-dd: mm: ss " kepada convert Tarikh untuk String apabila bala dan ThreadLocal membuat kami dateformat thread selamat.

Mari gunakan DateAdapter pada Buku kami :

@XmlRootElement(name = "book") @XmlType(propOrder = { "id", "name", "date" }) public class Book { private Long id; private String name; private String author; private Date date; @XmlAttribute public void setId(Long id) { this.id = id; } @XmlTransient public void setAuthor(String author) { 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; } }

Apabila kita menjalankan kod di atas, kita dapat memeriksa hasilnya di book.xml untuk mengesahkan bahawa kita telah berjaya mengubah objek Java kita menjadi XML menggunakan format tarikh baru " yyyy-MM-dd HH: mm: ss ":

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

7. JAXB-2 Maven Plugin

Plugin ini menggunakan Java API untuk XML Binding (JAXB), versi 2+, untuk menghasilkan kelas Java dari XML Schemas (dan opsional mengikat fail) atau untuk membuat skema XML dari kelas Java yang dijelaskan.

Perhatikan bahawa terdapat dua pendekatan asas untuk membina perkhidmatan web, Kontrak Terakhir dan Kontrak Pertama . Untuk keterangan lebih lanjut mengenai pendekatan ini, anda mungkin ingin melihat pautan berikut.

7.1. Menjana Kelas Java dari XSD

Plugin JAXB-2 Maven menggunakan alat yang disediakan oleh JDK XJC, alat penyusun JAXB Binding yang menghasilkan kelas Java dari XSD (XML Schema Definition).

Mari buat fail user.xsd yang mudah dan gunakan pemalam JAXB-2 Maven untuk menghasilkan kelas Java dari skema XSD ini:

Mari konfigurasikan pemalam JAXB-2 Maven:

 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  

Secara lalai, plugin ini mencari fail XSD di src / main / xsd . Kami mungkin mengkonfigurasi pencarian XSD dengan mengubah bahagian konfigurasi plugin ini di pom.xml dengan sewajarnya.

Secara lalai, Kelas Java ini dihasilkan dalam folder target / dihasilkan-sumber / jaxb . Kami mungkin mengubah direktori output dengan menambahkan elemen outputDirectory ke konfigurasi plugin. Kami juga boleh menambahkan elemen clearOutputDir dengan nilai false untuk mengelakkan fail dalam direktori ini dihapus .

Kami juga boleh mengkonfigurasi pengikatan JAXB global yang mengatasi peraturan pengikatan lalai:

The global.xjb atas mengatasi yang datetime jenis kepada java.util.Calendar jenis.

Semasa kita membina projek, ia menghasilkan fail kelas dalam folder src / main / java dan paket com.baeldung.jaxb.gen .

7.2. Menjana Skema XSD dari Java

The same plugin uses the JDK-supplied tool Schemagen. This is a JAXB Binding compiler tool that can generate an XSD schema from Java classes. In order for a Java Class to be eligible for an XSD schema candidate, the class must be annotated with a @XmlType annotation.

We reuse the Java class files from the previous example. Let's configure the 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    

By default, JAXB scans all the folders under src/main/java recursively for annotated JAXB classes. We may specify a different source folder for our JAXB annotated classes by adding a source element to the plug-in configuration.

Kami juga boleh mendaftarkan transformSchemas , pemproses pasca yang bertanggungjawab untuk menamakan skema XSD. Ia berfungsi dengan memadankan ruang nama dengan ruang nama dari Jenis XXml dari Kelas Java anda.

Semasa kita membina projek, ia menghasilkan fail user-gen.xsd di direktori src / main / resources .

8. Kesimpulannya

Dalam artikel ini, kami membahas konsep pengenalan mengenai JAXB. Untuk perinciannya, kita boleh melihat halaman utama JAXB.

Kita dapat mencari kod sumber untuk artikel ini di GitHub.