JAXB做错了; 尝试Xembly
JAXB是一項(xiàng)具有10年歷史的Java技術(shù),它使我們能夠?qū)ava對(duì)象轉(zhuǎn)換為XML文檔(編組)并返回(取消編組)。 我認(rèn)為這項(xiàng)技術(shù)基于setter和getter,并且通過將對(duì)象轉(zhuǎn)換為被動(dòng)數(shù)據(jù)結(jié)構(gòu)而違反了面向?qū)ο缶幊痰年P(guān)鍵原理。 我建議您改用Xembly將Java對(duì)象編組為XML文檔。
這就是JAXB編組的工作方式。 假設(shè)您有一個(gè)Book類,需要將其編組為XML文檔。 您必須創(chuàng)建吸氣劑并對(duì)其進(jìn)行注釋:
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}@XmlElementpublic String getIsbn() {return this.isbn;}@XmlElementpublic String getTitle() {return this.title;} }然后創(chuàng)建一個(gè)編組器,并要求它將Book類的實(shí)例轉(zhuǎn)換為XML:
final Book book = new Book("0132350882", "Clean Code"); final JAXBContext context = JAXBContext.newInstance(Book.class); final Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal(book, System.out);您應(yīng)該在輸出中期望這樣的事情:
<?xml version="1.0"?> <book><isbn>0132350882</isbn><title>Clean Code</title> </book>那怎么了 對(duì)象關(guān)系映射的錯(cuò)誤幾乎是同一回事,在ORM中解釋了“進(jìn)攻性反模式” 。 JAXB將對(duì)象視為數(shù)據(jù)包,提取數(shù)據(jù)并將其按照J(rèn)AXB的要求將其轉(zhuǎn)換為XML。 對(duì)象無法控制此過程。 因此,對(duì)象不再是對(duì)象 ,而是被動(dòng)的數(shù)據(jù)包。
一種理想的方法是重新設(shè)計(jì)我們的班級(jí)Book this:
public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}public String toXML() {// create XML document and return} }但是,這種方法存在一些問題。 首先,存在大量的代碼重復(fù)。 在Java中,構(gòu)建XML文檔是一個(gè)相當(dāng)冗長的過程。 如果每個(gè)類都必須在其toXML()方法中重新實(shí)現(xiàn)它,那么重復(fù)代碼將是一個(gè)大問題。
第二個(gè)問題是我們不確切知道應(yīng)該以哪種類型包裝XML文檔。它可能是String或InputStream或org.w3c.dom.Document的實(shí)例。 在每個(gè)對(duì)象中創(chuàng)建許多toXML()方法肯定是一場(chǎng)災(zāi)難。
Xembly提供了一種解決方案。 正如我前面提到的 ,它是XML結(jié)構(gòu)和操作命令式語言。 這是我們?nèi)绾卧赬embly的幫助下實(shí)現(xiàn)Book對(duì)象的方法:
import org.xembly.Directive; public class Book {private final String isbn;private final String title;public Book(final String isbn, final String title) {this.isbn = isbn;this.title = title;}public Iterable<Directive> toXembly() {return new Directives().add("book").add("isbn").set(this.isbn).up().add("title").set(this.title).up().up();} }現(xiàn)在,為了構(gòu)建XML文檔,我們應(yīng)該在對(duì)象外部使用以下代碼:
final Book book = new Book("0132350882", "Clean Code"); final String xml = new Xembler(book.toXembly()).xml();該Xembler類會(huì)將Xembly指令轉(zhuǎn)換為XML文檔。
此解決方案的優(yōu)點(diǎn)在于,不通過getter公開對(duì)象的內(nèi)部,并且該對(duì)象完全負(fù)責(zé)XML編組過程。 另外,這些指令的兼容性可能很高-遠(yuǎn)遠(yuǎn)高于JAXB的繁瑣注釋。
- Xembly是一個(gè)開源項(xiàng)目,因此隨時(shí)向Github提交您的問題或更正。
翻譯自: https://www.javacodegeeks.com/2015/04/jaxb-is-doing-it-wrong-try-xembly.html
總結(jié)
以上是生活随笔為你收集整理的JAXB做错了; 尝试Xembly的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奔跑吧僵尸食物电脑版(奔跑吧僵尸食物们官
- 下一篇: 摆脱匿名类