2009-07-27 24 views
7

既存のJavaクラスのセットから生成されたxsdを持っていますが、現在は期待どおりにXMLメッセージをオブジェクトにアンマーシャルできます。私が持っていた場合、オブジェクトの既存のインスタンスをアンマーシャラーは、単純に(ここではそのちょうど私の頭の上から任意の構文エラーを許し)JAXBを使用してXMLを既存のオブジェクトにアンマーシャリングする

を例えばそれ

に渡されたメッセージの中に含まれているフィールドを更新しています注釈付きクラス多くのフィールド、タイトル、作者、出版されたものなどが含まれており、対応する生成されたxsdが必要なフィールドの多くがあります。次のxを受け取った場合、 mlの

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

ではなく、単にタイトルだけで新しいブックのインスタンスを作成、更新などの既存のインスタンスにこれを適用する設定されているので、単にそのインスタンス上のタイトル変数を設定します。

+0

ああ、私はXMLをアンマーシャルするために、現時点でJAXBを使用しています – robinsad

答えて

5

JAXBはあなたにはできません。ただし、JAXBを使用してXML文書を新しいオブジェクトにアンマーシャリングし、新しいオブジェクトのプロパティを既存のオブジェクトに反映することができます。

Commons BeanUtilsは、BeanUtils.copyPropertiesメソッドのようなメカニズムを提供します。私はこれがディープコピーをするかどうかは分かりません。

0

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

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

あなたの識別子titleは子要素なので、他の要素の前にJAXBがtitle要素を訪問するという保証はありません。この問題を回避する最も簡単な方法は、Unmarshallerによって作成されたBookインスタンスのプロパティをシングルトンBookインスタンスにコピーすることです。

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文書からオブジェクトを登録したい場合は、それはもう少し複雑です:afterUnmarsalコールバックは、これを行うための場所です。限り、あなたはネストされたブックを持っていないように動作します

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); 
} 
} 

:あなたのケースでは、おそらくのような何かをしたいです。

関連する問題