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

これは、 JAXB2 Commonsの Copyable プラグイン- Copyable+pluginを使用して実現できます。

于 2010-07-19T10:46:36.713 に答える
0

これは JAXB で機能しますが、ほとんどの作業は自分で行う必要があります。

あなたの例では、オブジェクトを予約するためのタイトルのシングルトン レジストリのようなルックアップ機能が必要です。

識別子 title は子要素であるため、JAXB が他の要素の前に title 要素にアクセスするという保証はありません。これを回避する最も簡単な方法は、アンマーシャラーによって作成された 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 に答える