JAXB做错了; 尝试Xembly
JAXB是一項具有10年歷史的Java技術,它使我們能夠將Java對象轉換為XML文檔(編組)并返回(取消編組)。 我認為這項技術基于setter和getter,并且通過將對象轉換為被動數據結構而違反了面向對象編程的關鍵原理。 我建議您改用Xembly將Java對象編組為XML文檔。
這就是JAXB編組的工作方式。 假設您有一個Book類,需要將其編組為XML文檔。 您必須創建吸氣劑并對其進行注釋:
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;} }然后創建一個編組器,并要求它將Book類的實例轉換為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);您應該在輸出中期望這樣的事情:
<?xml version="1.0"?> <book><isbn>0132350882</isbn><title>Clean Code</title> </book>那怎么了 對象關系映射的錯誤幾乎是同一回事,在ORM中解釋了“進攻性反模式” 。 JAXB將對象視為數據包,提取數據并將其按照JAXB的要求將其轉換為XML。 對象無法控制此過程。 因此,對象不再是對象 ,而是被動的數據包。
一種理想的方法是重新設計我們的班級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} }但是,這種方法存在一些問題。 首先,存在大量的代碼重復。 在Java中,構建XML文檔是一個相當冗長的過程。 如果每個類都必須在其toXML()方法中重新實現它,那么重復代碼將是一個大問題。
第二個問題是我們不確切知道應該以哪種類型包裝XML文檔。它可能是String或InputStream或org.w3c.dom.Document的實例。 在每個對象中創建許多toXML()方法肯定是一場災難。
Xembly提供了一種解決方案。 正如我前面提到的 ,它是XML結構和操作命令式語言。 這是我們如何在Xembly的幫助下實現Book對象的方法:
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();} }現在,為了構建XML文檔,我們應該在對象外部使用以下代碼:
final Book book = new Book("0132350882", "Clean Code"); final String xml = new Xembler(book.toXembly()).xml();該Xembler類會將Xembly指令轉換為XML文檔。
此解決方案的優點在于,不通過getter公開對象的內部,并且該對象完全負責XML編組過程。 另外,這些指令的兼容性可能很高-遠遠高于JAXB的繁瑣注釋。
- Xembly是一個開源項目,因此隨時向Github提交您的問題或更正。
翻譯自: https://www.javacodegeeks.com/2015/04/jaxb-is-doing-it-wrong-try-xembly.html
總結
以上是生活随笔為你收集整理的JAXB做错了; 尝试Xembly的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奔跑吧僵尸食物电脑版(奔跑吧僵尸食物们官
- 下一篇: wifi是开放性的怎样设置密码?