Apa itu JAXB dan mengapa saya menggunakannya? [Tutup]

109

Ada pria di sini yang bersumpah bahwa JAXB adalah yang terhebat sejak roti iris. Saya penasaran untuk melihat apa yang menurut pengguna Stack Overflow sebagai kasus penggunaan untuk JAXB dan apa yang menjadikannya solusi yang baik atau buruk untuk kasus tersebut.

Jay R.
sumber
2
Baca Artikel ini (Arsitektur Java untuk XML Binding (JAXB)) ini adalah yang terbaik. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Jawaban:

99

Saya penggemar berat JAXB karena memanipulasi XML. Pada dasarnya, ini memberikan solusi untuk masalah ini (saya berasumsi sudah terbiasa dengan XML, struktur data Java, dan Skema XML):

Bekerja dengan XML itu sulit. Seseorang membutuhkan cara untuk mengambil file XML - yang pada dasarnya adalah file teks - dan mengubahnya menjadi semacam struktur data, yang kemudian dapat dimanipulasi oleh program Anda.

JAXB akan mengambil Skema XML yang Anda tulis dan membuat sekumpulan kelas yang sesuai dengan skema itu. Utilitas JAXB akan membuat hierarki struktur data untuk memanipulasi XML itu.

JAXB kemudian dapat digunakan untuk membaca file XML, dan kemudian membuat instance kelas yang dihasilkan - sarat dengan data dari XML Anda. JAXB juga melakukan kebalikannya: mengambil kelas java, dan menghasilkan XML yang sesuai.

Saya suka JAXB karena mudah digunakan, dan dilengkapi dengan Java 1.6 (jika Anda menggunakan 1.5, Anda dapat mengunduh JAXB .jars.) Cara membuat hierarki kelas sangat intuitif, dan menurut pengalaman saya, berfungsi dengan baik mengabstraksi "XML" sehingga saya bisa fokus pada "data".

Jadi untuk menjawab pertanyaan Anda: Saya berharap, untuk file XML kecil, JAXB mungkin berlebihan. Ini mengharuskan Anda untuk membuat dan memelihara skema XML, dan menggunakan "metode buku teks standar" untuk memanfaatkan kelas Java untuk struktur data. (Kelas utama, kelas dalam kecil untuk mewakili "node", dan hierarki yang sangat besar dari mereka.) Jadi, JAXB mungkin tidak terlalu bagus untuk daftar linier sederhana "preferensi" untuk suatu aplikasi.

Tetapi jika Anda memiliki skema XML yang agak rumit, dan banyak data yang terkandung di dalamnya, maka JAXB sangat bagus. Dalam proyek saya, saya mengonversi sejumlah besar data antara biner (yang dikonsumsi oleh program C) dan XML (sehingga manusia dapat mengonsumsi dan memodifikasi data itu). Skema XML yang dihasilkan tidak sepele (banyak tingkat hierarki, beberapa bidang dapat diulang, yang lain tidak dapat) sehingga JAXB sangat membantu untuk dapat memanipulasinya.

poundifdef.dll
sumber
21
JAXB bisa dilakukan tanpa XSD. Anda dapat menggunakan anotasi: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger
7
JAXB adalah sebuah spek (seperti JPA atau JAXP), artinya ada beberapa implementasi (Metro, EclipseLink, dll). Jika Anda mengalami masalah, Anda dapat beralih ke implementasi lain. Anda juga dapat memanfaatkan ekstensi yang ditawarkan oleh vendor yang berbeda.
bdoughan
@BlaiseDoughan, Metro adalah implementasi JAXB?! Bukankah Metro adalah implementasi WSIT?
Muhammad Gelbana
1
@MuhammadGelbana - Saya kira saya harus menyebutnya sebagai Proyek JAXB ( jaxb.java.net ) yang merupakan bagian dari implementasi Metro JAX-WS ( metro.java.net ).
bdoughan
2
FYI, JAXB sedang dihapus dari Java SE 11. Lihat JEP 320: Hapus Modul Java EE dan CORBA . Tindakan ini dilakukan sebagai bagian dari modularisasi Java SE , dan penyerahan teknologi Java EE ke proyek Jakarta EE . Anda harus menambahkan JAXB API & implementasi ke proyek Anda.
Basil Bourque
23

Berikut alasan untuk tidak menggunakannya: kinerja menderita. Ada banyak overhead saat marshaling dan unmarshaling. Anda mungkin juga ingin mempertimbangkan API lain untuk pengikatan Objek XML - seperti JiBX: http://jibx.sourceforge.net/

kode jari
sumber
1
Juga pertimbangkan untuk menggunakan alat XSD2Jibx jika Anda mengalami masalah dengan pengikatan - ini dalam status "alpha", tetapi sangat membantu menggambarkan kelas dan pengikatan yang disukainya dengan skema XSD ... sekarang, jika hanya itu berhenti menggunakan tanggal SQL secara default , dan menggunakan Java util Date sebagai gantinya ...
MetroidFan2002
3
Omong kosong. JAXB cukup cepat, selama Anda menggunakan fast parser (seperti Woodstox), overhead mungkin 30-40% dibandingkan dengan binding manual. JiBX baik-baik saja, tidak masalah, tetapi perbedaan performa tidak terlalu besar.
StaxMan
6
Saya telah menggunakan JAXB di beberapa proyek, dan terus menggunakannya. Tetapi penting untuk memahami bagaimana ini dibandingkan dengan kerangka kerja lain. Jika Anda menyusun / menghapus dokumen berukuran ratusan megabyte, dan waktu itu penting - JiBX adalah alternatif yang baik. JAXB == refleksi, JiBX == instrumentasi kode byte.
codefinger
19

Ini adalah "ORM untuk XML". Paling sering digunakan bersama JAX-WS (dan memang implementasi Sun dikembangkan bersama) untuk sistem WS Death Star.

Tom Hawtin - tackline
sumber
19

Saya menggunakan JAXB di tempat kerja sepanjang waktu dan saya sangat menyukainya. Ini sempurna untuk skema XML kompleks yang selalu berubah dan terutama bagus untuk akses acak tag dalam file XML.

Saya benci menjadi germo tetapi saya baru saja memulai sebuah blog dan ini benar-benar hal pertama yang saya posting!

Lihat disini:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/

artgon
sumber
4
Contoh yang jelas di blog Anda. Suara positif untuk itu. :-)
Shawn D.
9

Dengan JAXB Anda dapat secara otomatis membuat representasi XML dari objek Anda (marshalling) dan representasi objek XML (unmarshalling).

Sejauh menyangkut Skema XML, Anda memiliki dua pilihan:

  • Hasilkan kelas Java dari XSD
  • Hasilkan XSD dari kelas Java Anda

Ada juga beberapa perpustakaan serialisasi XML yang lebih sederhana seperti XStream , Digester atau XMLBeans yang mungkin menjadi alternatif.

Fabian Steeg
sumber
1
Ini bukan kerangka kerja yang mengikat, mereka adalah pustaka serialisasi. Kerangka kerja pengikatan yang baik dapat memetakan XML apa pun ke grafik objek isomorfik atau sebaliknya. Mekanisme serialisasi sederhana ini menghasilkan dan menggunakan skema XML tetap dan non-standar.
erickson
Terima kasih erickson, saya hanya bekerja dengan JAXB dan ingin memastikan saya menyebutkan alternatif. Saya akan mengedit jawaban saya berdasarkan masukan Anda.
Fabian Steeg
Sebenarnya, meskipun XStream baik-baik saja, ini tidak terlalu sederhana, karena keduanya sangat sederhana. Dan Digester BUKAN sederhana, hanya sederhana.
StaxMan
2
Seseorang tolong sebutkan JAXB-2.0 menggunakan Anotasi. Di antara beberapa kelas XmlAdapter itu, saya dapat memetakan skema apa pun ke struktur Java apa pun yang ada.
Mark Renouf
8

JAXB sangat bagus jika Anda harus membuat kode ke beberapa spesifikasi XML eksternal yang didefinisikan sebagai skema XML ( xsd).

Misalnya, Anda memiliki aplikasi perdagangan dan Anda harus melaporkan perdagangan tersebut ke Aplikasi Pelaporan Perdagangan Uber Lame dan mereka telah memberi Anda ultra.xsduntuk melanjutkan. Gunakan $JAVA_HOME/bin/xjckompiler untuk mengubah XML menjadi sekumpulan kelas Java (misalnya UltraTrade).

Kemudian Anda cukup menulis lapisan adaptor sederhana untuk mengonversi objek perdagangan Anda UltraTradesdan menggunakan JAXBuntuk mengumpulkan data ke Ultra-Corp. Jauh lebih mudah daripada mengotak-atik mengubah perdagangan Anda ke dalam format XML mereka.

Di mana semuanya rusak adalah ketika Ultra-Corp belum benar-benar mematuhi spesifikasi mereka sendiri, dan perdagangan priceyang mereka miliki xsd:floatseharusnya benar-benar dinyatakan sebagai double!

oxbow_lakes
sumber
1
Perhatikan juga bahwa Anda BISA melakukan kode pertama: mulai dengan kacang, buat skema jika Anda membutuhkannya.
StaxMan
7

Mengapa kita membutuhkan JAXB? Komponen jarak jauh (ditulis dalam Java) dari layanan web menggunakan XML sebagai sarana untuk bertukar pesan antara satu sama lain. Mengapa XML? Karena XML dianggap opsi ringan untuk bertukar pesan di Jaringan dengan sumber daya terbatas. Seringkali kita perlu mengubah dokumen XML ini menjadi objek dan sebaliknya. Misalnya: Simple Java POJO Employee dapat digunakan untuk mengirim data Karyawan ke komponen jarak jauh (juga program Java).

class Employee{
 String name;
 String dept;
 ....
}

Pojo ini harus diubah (Marshall) ke dalam dokumen XML sebagai berikut:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

Dan pada komponen remote, kembali ke objek Java dari dokumen XML (Un-Marshall).

Apa itu JAXB?

JAXB adalah library atau alat untuk melakukan operasi Marshalling dan UnMarshalling ini. Ini menghindarkan Anda dari sakit kepala ini, sesederhana itu.

Prashant_M
sumber
4

Anda juga dapat melihat JIBX. Ini juga merupakan pengikat data xml yang sangat bagus, yang juga berspesialisasi dalam OTA (Open Travel Alliance) dan didukung oleh server AXIS2. Jika Anda mencari kinerja dan kompatibilitas, Anda dapat memeriksanya:

http://jibx.sourceforge.net/index.html

LostMohican
sumber
0

JAXB memberikan peningkatan kinerja melalui pengoptimalan marshalling default. JAXB mendefinisikan API programmer untuk membaca dan menulis objek Java ke dan dari dokumen XML, sehingga menyederhanakan pembacaan dan penulisan XML melalui Java.


sumber