日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAXB做错了; 尝试Xembly

發(fā)布時(shí)間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAXB做错了; 尝试Xembly 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。