Saya baru menggunakan JAXB, dan saya menggunakan xjc JAXB 2.1.3 untuk menghasilkan satu set kelas dari Skema XML saya. Selain menghasilkan kelas untuk setiap elemen dalam skema saya, itu membuat kelas ObjectFactory.
Sepertinya tidak ada yang menghentikan saya untuk membuat instance elemen secara langsung, mis
MyElement element = new MyElement();
sedangkan tutorial tampaknya lebih memilih
MyElement element = new ObjectFactory().createMyElement();
Jika saya melihat ke ObjectFactory.java, saya melihat:
public MyElement createMyElement() {
return new MyElement();
}
jadi apa masalahnya? Mengapa saya harus repot-repot menjaga kelas ObjectFactory? Saya berasumsi ini juga akan ditimpa jika saya melakukan kompilasi ulang dari skema yang diubah.
Jawaban:
Kompatibilitas ke belakang bukan satu-satunya alasan. :-P
Dengan skema yang lebih rumit, seperti skema yang memiliki batasan rumit pada nilai yang dapat diambil oleh konten elemen, terkadang Anda perlu membuat
JAXBElement
objek sebenarnya . Mereka biasanya tidak mudah dibuat dengan tangan, jadicreate*
metode ini bekerja keras untuk Anda. Contoh (dari skema XHTML 1.1):Beginilah cara Anda memasukkan
<style>
tag ke dalam<head>
tag:Tiga penggunaan pertama dari
ObjectFactory
dapat dianggap berlebihan (meskipun berguna untuk konsistensi), tetapi yang keempat membuat JAXB jauh lebih mudah digunakan. Pencitraan harus menulisnew JAXBElement
dengan tangan setiap kali!sumber
Seperti yang ditunjukkan @Chris, terkadang JAXB tidak dapat bekerja dengan POJO, karena skema tidak dapat dipetakan secara tepat ke Java. Dalam kasus ini,
JAXBElement
objek pembungkus diperlukan untuk memberikan informasi tipe tambahan.Ada dua contoh konkret yang saya temukan di mana ini umum.
Jika Anda ingin mengatur objek dari kelas yang tidak memiliki
@XmlRootElement
anotasi. Secara default XJC hanya menghasilkan@XmlRootElement
untuk beberapa elemen, dan tidak untuk yang lain. Logika yang tepat untuk ini agak rumit, tetapi Anda dapat memaksa XJC untuk menghasilkan lebih banyak@XmlRootElement
kelas menggunakan "mode pengikatan sederhana"Saat skema Anda menggunakan grup substituion. Ini adalah penggunaan skema yang cukup canggih, tetapi XJC menerjemahkan grup substitusi ke dalam Java dengan menggunakan banyak
JAXBElement
pembungkus.Jadi dalam model objek yang dihasilkan XJC yang banyak menggunakan
JAXBElement
(untuk alasan apa pun), Anda memerlukan cara untuk membuatJAXBElement
instance tersebut. Yang dihasilkanObjectFactory
sejauh ini adalah cara termudah untuk melakukannya. Anda dapat membuatnya sendiri, tetapi itu kikuk dan rawan kesalahan untuk melakukannya.sumber
Kompatibilitas ke belakang, saya kira ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
sumber