Panduan untuk JAXB

1. Perkenalan

Ini adalah artikel pengantar tentang JAXB (Java Architecture for XML Binding).

Pertama, kami akan menunjukkan cara mengonversi objek Java ke XML dan sebaliknya, lalu kami akan fokus pada pembuatan kelas Java dari skema XML dan sebaliknya dengan menggunakan plugin JAXB-2 Maven.

2. Ikhtisar

JAXB menyediakan cara yang cepat dan nyaman untuk marshal (menulis) objek Java ke XML dan un-marshal (baca) XML ke dalam objek. Ini mendukung kerangka kerja pengikat yang memetakan elemen dan atribut XML ke bidang dan properti Java menggunakan anotasi Java.

Plugin JAXB-2 Maven mendelegasikan sebagian besar pekerjaannya ke salah satu dari dua alat yang disediakan JDK, XJC dan Schemagen.

3. Anotasi JAXB

JAXB menggunakan anotasi Java untuk menambah kelas yang dihasilkan dengan informasi tambahan. Menambahkan anotasi semacam itu ke kelas Java yang ada mempersiapkannya untuk runtime JAXB.

Mari pertama-tama buat objek Java sederhana untuk mengilustrasikan 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 berisi penjelasan berikut:

  • @XmlRootElement : t dia nama elemen XML root diturunkan dari nama kelas dan kita juga dapat menentukan nama elemen root XML menggunakan atribut namanya
  • @XmlType : menentukan urutan penulisan kolom dalam file XML
  • @XmlElement : menentukan nama elemen XML sebenarnya yang akan digunakan
  • @XmlAttribute : mendefinisikan bidang id yang dipetakan sebagai atribut, bukan sebagai elemen
  • @XmlTransient : anotasi bidang yang tidak ingin kita sertakan dalam XML

Untuk detail lebih lanjut tentang anotasi JAXB, Anda mungkin ingin melihat tautan berikut.

4. Marshalling - Mengubah Objek Java ke XML

Marshalling menyediakan aplikasi klien kemampuan untuk mengubah pohon objek Java yang diturunkan JAXB menjadi data XML. Secara default, Marshaller menggunakan encoding UTF-8 saat membuat data XML. Selanjutnya, kami akan menghasilkan file XML dari objek Java.

Mari buat program sederhana menggunakan JAXBContext yang menyediakan abstraksi untuk mengelola informasi pengikatan XML / Java yang diperlukan untuk mengimplementasikan operasi kerangka kerja pengikatan 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")); }

Kelas javax.xml.bind.JAXBContext menyediakan titik masuk klien ke JAXB API. Secara default, JAXB tidak memformat dokumen XML. Ini menghemat ruang dan mencegah ruang putih apa pun secara tidak sengaja dapat diartikan sebagai signifikan.

Untuk memiliki format JAXB output kita cukup mengatur properti Marshaller.JAXB_FORMATTED_OUTPUT menjadi true di Marshaller . Metode marshal menggunakan objek dan file keluaran tempat menyimpan XML yang dihasilkan sebagai parameter.

Saat kami menjalankan kode di atas, kami dapat memeriksa hasilnya di book.xml untuk memverifikasi bahwa kami berhasil mengubah objek Java menjadi data XML:

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

5. Un-marshalling - Mengubah XML ke Objek Java

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

Mari kita gunakan JAXB Unmarshaller untuk un-marshal kami book.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")); }

Saat kami menjalankan kode di atas, kami mungkin memeriksa output konsol untuk memverifikasi bahwa kami telah berhasil mengubah data XML menjadi objek Java:

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

6. Tipe Data Kompleks

Saat menangani tipe data kompleks yang mungkin tidak tersedia secara langsung di JAXB, kami mungkin menulis adaptor untuk menunjukkan JAXB bagaimana mengelola tipe tertentu.

Dengan menggunakan XmlAdapter JAXB , kita dapat mendefinisikan kode khusus untuk mengubah kelas yang tidak dapat dipetakan menjadi sesuatu yang dapat ditangani JAXB. The @XmlJavaTypeAdapter penjelasan menggunakan adaptor yang memperpanjang XmlAdapter kelas untuk marshaling kustom.

Mari buat adaptor untuk menentukan format tanggal saat menyusun:

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 tanggal " yyyy-MM-hh HH: mm: ss " untuk mengonversi Date ke String saat marshalling dan ThreadLocal untuk membuat ThreadFormat aman untuk thread.

Mari terapkan DateAdapter ke Buku kita :

@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; } }

Ketika kita menjalankan kode di atas, kita dapat memeriksa hasilnya di book.xml untuk memverifikasi bahwa kita telah berhasil mengubah objek Java kita menjadi XML menggunakan format tanggal baru “ yyyy-MM-dd HH: mm: ss “:

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

7. Plugin JAXB-2 Maven

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

Perhatikan bahwa ada dua pendekatan mendasar untuk membangun layanan web, Kontrak Terakhir dan Kontrak Pertama . Untuk detail lebih lanjut tentang pendekatan ini, Anda mungkin ingin melihat tautan berikut.

7.1. Menghasilkan Kelas Java dari XSD

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

Mari buat file user.xsd sederhana dan gunakan plugin JAXB-2 Maven untuk menghasilkan kelas Java dari skema XSD ini:

Mari konfigurasikan plugin 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 default, plugin ini menempatkan file XSD di src / main / xsd . Kita dapat mengkonfigurasi pencarian XSD dengan memodifikasi bagian konfigurasi plugin ini di pom.xml yang sesuai.

Secara default, Kelas Java ini dibuat di folder target / generated-resources / jaxb . Kita dapat mengubah direktori keluaran dengan menambahkan elemen keluaranDirectory ke konfigurasi plugin. Kami juga dapat menambahkan elemen clearOutputDir dengan nilai false untuk mencegah file di direktori ini dihapus.

Kami juga dapat mengonfigurasi pengikatan JAXB global yang menggantikan aturan pengikatan default:

The global.xjb atas menimpa para datetime jenis ke java.util.Calendar jenis.

Saat kita membangun proyek, ini menghasilkan file kelas di folder src / main / java dan paket com.baeldung.jaxb.gen .

7.2. Menghasilkan 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 dapat mendaftarkan transformSchemas , prosesor pos yang bertanggung jawab untuk memberi nama skema XSD. Ia bekerja dengan mencocokkan namespace dengan namespace dari @XmlType Kelas Java Anda.

Saat kita membangun proyek, ini menghasilkan file user-gen.xsd di direktori src / main / resources .

8. Kesimpulan

Pada artikel ini, kami membahas konsep pengantar di JAXB. Untuk lebih jelasnya kita bisa lihat di home page JAXB.

Kami dapat menemukan kode sumber untuk artikel ini di GitHub.