当前位置: 首页 > 工具软件 > Xembly > 使用案例 >

jaxb报错_JAXB做错了; 尝试Xembly

连坚白
2023-12-01

jaxb报错

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;
  }
  @XmlElement
  public String getIsbn() {
    return this.isbn;
  }
  @XmlElement
  public 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文档。它可能是StringInputStreamorg.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报错

 类似资料: