状況
Javaに複雑なモデルオブジェクトグラフがあり、XMLドキュメントに前後に変換する必要があります。XMLドキュメントのスキーマのオブジェクトグラフ構造は、モデルのオブジェクトツリーとは大きく異なります。この2つは互換性がありますが、変換には、親/子のような関係が使用される多くのコンテキスト駆動型ロジックが必要です。
問題
古いシステムで十分に確立されているモデルオブジェクトを使用していますが、XMLドキュメントのスキーマはかなり新しいものです。コードの多くはモデルオブジェクトの構造に依存しているため、それらを再構築する必要はありません。これが私が扱っている構造の違いのタイプの簡単な例です:
データモデルツリーの例
アイテム
- 説明
- 費用
- ..。
人
- ファーストネーム
- 苗字
- 住所
- ..。
住所
- 街
- 街
- ..。
SaleTransaction(*これは翻訳されているものです)
- バイヤー(人)
- 売り手(人)
- 販売アイテム[](リスト)
- 交換品[](リスト)
- 取引場所(住所)
XMLドキュメント構造の例
交換
- タイプ
- 締約国
- party_contact_ref
- タイプ
- contact_id
- 交換の詳細
- タイプ
- total_amount_exchanged
- アイテム
- アイテム
- タイプ
- owning_party_contact_ref_id
- exchange_use_type
- 連絡先
- コンタクト
- id
- タイプ
交換タイプ:[現金販売| 物々交換| 現金と物々交換の組み合わせ]
連絡先の種類:[担当者| 住所 ]
交換詳細タイプ:[現金交換| 物々交換]
1-1ではなく、SaleTransactionとExchangeの間のマッピングが可能です。この例では、モデルの「バイヤー」は、XMLドキュメントの連絡先要素と連絡先参照要素の両方にマップされます。また、「Item」要素の「owning_party_contact_ref_id」属性の値は、SaleTransactionオブジェクトグラフのいくつかの異なる値を調べることによって決定されます。
私が使用しているオブジェクトグラフをXMLドキュメントで使用するために変換が必要な場合、私の頼りになるツールはXmlAdapterです。ただし、この場合、3つの理由から、JAXBXMLアダプターを実行可能なソリューションとして使用することはできません。
- モデルグラフ内のオブジェクトが対応するXML要素も、データに依存します。XmlAdapterからクラス/プロパティへのマッピングはすべて修正されていると思います。
- XmlAdaptersを使用して、多対1、または1対多のソリューションを実行することは不可能のようです。MOXyには興味深い拡張機能がありますが、ここでも、プロパティへの固定マッピングが必要です。
- 私の知る限り、XmlAdaptersは個々のオブジェクトを処理し、マーシャリング/アンマーシャリングされているグラフ全体のコンテキストを取得する方法がありません。
質問
この種の問題はかなり一般的だと思いますが、どのように対処しますか?標準ツールでこの問題を処理する方法はありますか?
私が思いついたもの
興味深い場合のために、私が思いついた可能なアプローチは次のとおりです。
#1 オブジェクトグラフの変換の問題をXML生成の問題から分離します。コンテキストオブジェクトに基づいてオブジェクトグラフを生成するのに役立つ自家製のツールがあります。XMLスキーマからJAXBクラスを作成し、このツールを使用して、モデルオブジェクトのコンテキストに基づいてそれらのクラスのオブジェクトを生成することができます。これは、モデルオブジェクトグラフからXMLドキュメントを生成するのに適していますが、その逆はできません。また、非標準のツールに依存することも意味しますが、可能であれば避けたいと思います。
#2 XmlAdapterに夢中になり、翻訳状態情報を保持できるようにモデルクラスを変更します(たとえば、モデルツリーのこのオブジェクトはXMLドキュメントでこの要素を作成するために使用されました)。これにより、問題はJAXBの標準的な使用モデルに非常に近くなりますが、開発、テスト、および保守するのは悪夢だと思います。
#3 #1と同じようにオブジェクトグラフの問題を分離しますが、JAXBの代わりにJDOMを使用します。これにより、JAXBに必要なすべてのクラスとマッピングが削除されますが、モデルオブジェクトからDOMツリーへのマッピングを管理するために別のカスタムツールを構築する必要があります。
私は3つの解決策のどれにもそれほど興奮していませんが、私は#1に最も部分的です。