8

我有一个从一组现有的java类生成的xsd,目前它成功地将XML消息解组到对象中,但是我想要做的是我有一个现有的对象实例让解组器简单地更新传递给它的消息中包含的字段

例如(请原谅这里的任何语法错误,这只是我的想法)

如果我有一个带有许多字段、标题、作者、已发布等以及相应生成的 xsd 的带注释的类 Book,那么如果我收到以下 xml,我希望能够将很多字段设置为不需要

<Book>
 <title>Dummys guide to JAXB</title>
</Book>

而不是简单地创建一个仅包含标题集的新 Book 实例,将其应用于现有实例作为更新,因此只需在该实例上设置标题变量。

4

3 回答 3

5

JAXB 不能为您做到这一点,不。但是,您可以做的是使用 JAXB 将您的 XML 文档解组到一个新对象上,然后反射性地将新对象的属性复制到您现有的对象上。

Commons BeanUtils为此提供了一种机制,比如BeanUtils.copyProperties方法。不过,我不确定这是否会进行深度复制。

于 2009-07-27T15:55:51.150 回答
0

您可以使用 JAXB 完成这项工作,但您必须自己完成大部分工作。

在您的示例中,您需要查找功能,例如用于预订对象的单例标题注册表。

由于您的标识符 title 是一个子元素,因此无法保证 JAXB 会在访问任何其他元素之前访问该 title 元素。解决此问题的最简单方法是将 Unmarshaller 创建的 Book 实例中的属性复制到您的单例 Book 实例中。afterUnmarsal回调是执行此操作的地方:

class Book {
 // ...
 private void afterUnmarshal(Unmarshaller reader, Object parent) { 
   Book singleton = BookRegistry.getInstance().getBook(this.title);
   if (this.publisher != null) singleton.setPublisher(this.publisher);
   if (this.author != null) singleton.setPublisher(this.publisher);
   // ...
 }
}

如果您想在运行中从 XML 文档中注册对象,它会稍微复杂一些。在你的情况下,你可能想要这样的东西:

class Book {
 // ...
 public void setTitle(String title) {
    this.title = title;
    Book singleton = BookRegistry.getInstance().getBook(this.title);
    if (singleton == null) BookRegistry.getInstance().addBook(this.title, this);
 }
}

只要您没有嵌套书籍,它就会起作用。

于 2009-07-27T17:13:56.937 回答
0

您可以使用JAXB2 Commons中的 Copyable 插件来实现这一点- Copyable+plugin

于 2010-07-19T10:46:36.713 回答