5

状況

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アダプターを実行可能なソリューションとして使用することはできません。

  1. モデルグラフ内のオブジェクトが対応するXML要素も、データに依存します。XmlAdapterからクラス/プロパティへのマッピングはすべて修正されていると思います。
  2. XmlAdaptersを使用して、多対1、または1対多のソリューションを実行することは不可能のようです。MOXyには興味深い拡張機能がありますが、ここでも、プロパティへの固定マッピングが必要です。
  3. 私の知る限り、XmlAdaptersは個々のオブジェクトを処理し、マーシャリング/アンマーシャリングされているグラフ全体のコンテキストを取得する方法がありません。

質問

この種の問題はかなり一般的だと思いますが、どのように対処しますか?標準ツールでこの問題を処理する方法はありますか?

私が思いついたもの

興味深い場合のために、私が思いついた可能なアプローチは次のとおりです。

#1 オブジェクトグラフの変換の問題をXML生成の問題から分離します。コンテキストオブジェクトに基づいてオブジェクトグラフを生成するのに役立つ自家製のツールがあります。XMLスキーマからJAXBクラスを作成し、このツールを使用して、モデルオブジェクトのコンテキストに基づいてそれらのクラスのオブジェクトを生成することができます。これは、モデルオブジェクトグラフからXMLドキュメントを生成するのに適していますが、その逆はできません。また、非標準のツールに依存することも意味しますが、可能であれば避けたいと思います。

#2 XmlAdapterに夢中になり、翻訳状態情報を保持できるようにモデルクラスを変更します(たとえば、モデルツリーのこのオブジェクトはXMLドキュメントでこの要素を作成するために使用されました)。これにより、問題はJAXBの標準的な使用モデルに非常に近くなりますが、開発、テスト、および保守するのは悪夢だと思います。

#3 #1と同じようにオブジェクトグラフの問題を分離しますが、JAXBの代わりにJDOMを使用します。これにより、JAXBに必要なすべてのクラスとマッピングが削除されますが、モデルオブジェクトからDOMツリーへのマッピングを管理するために別のカスタムツールを構築する必要があります。

私は3つの解決策のどれにもそれほど興奮していませんが、私は#1に最も部分的です。

4

4 に答える 4

2

1はあなたの最善の策です。マッピングコードを書くのは面倒ですが、賢くなりすぎないようにする必要があります。使用するマッピングツールには構成が必要です。これは、Javaマッピングコードを手動で作成するのと同じくらいの作業になると思います。ユニットテストをたくさん書くだけです。

同様の名前のフィールドを持つクラスに対してDozerを試すことができます。これは、リフレクションを使用してマッピングを行います。これは過去に使用したことがありますが、スキーマはドメインオブジェクトに似ているため、あまり役に立たない可能性があります。

コードをより快適にするために、fluent-apiやvalue-constructorプラグインなど、JAXB用に見つけることができるすべてのxjcプラグインを使用してください。

于 2012-07-05T20:47:58.673 に答える
1

私が使用しているオブジェクトツリーをXMLドキュメントで使用するために変換が必要な場合、私の頼りになるツールはXmlAdapterです。ただし、この場合、実行可能なソリューションとしてJAXBXMLアダプターを使用することはできません。私の知る限り、XmlAdaptersは個々のオブジェクトを処理し、マーシャリング/アンマーシャリングされているツリー全体のコンテキストを取得する方法がありません。

通常、anはステートレスですが、状態を含む/上のXmlAdapterインスタンスを指定できます。必要なのはこれだけかもしれません。XmlAdapterMarshallerUnmarshaller

YourAdapter yourAdapter = new YourAdapter();
yourAdapter.setState(someState);
marshaller.setAdapter(yourAdapter);
unmarshaller.setAdapter(yourAdapter);

Marshaller/で指定したインスタンスUnmarshallerは、対応するクラスが構成された場所で使用されます。

@XmlJavaTypeAdpater(YourAdapter.class)

詳細については

于 2012-07-05T20:30:50.637 に答える
0

申し訳ありませんが、正直な回答はできませんが、私の評判についてはまだコメントできませんので、ここに私の「回答」を示します。

私は間違いなくAltovaXMLSpyとそのコード生成機能を試してみます。私はそれを試し、信じられないほど役に立ちました。それができるかどうかはわかりませんが、逆の方法で作業することですが、データベース接続などもあるので、試してみても害はないと確信しています。それ。

彼らはまた、私が試したことがないMapForce(マッピングデータベースのように、GISではない)と呼ばれる別のアプリケーションを持っていますが、それらから私はそれが本当に役立つことを期待します。

これらすべてが非常に役立つことを願っています。また、これがどのように役立ったか(または役立たなかったか)について、より詳細にコメントできることを願っています。

于 2012-07-05T19:29:20.307 に答える
0

xsdスキーマがある場合は、castorなどのツールを使用してpojoを生成すると非常に便利です。生成されたpojoを含むパッケージを作成したら、ドーザーを使用して、「古い」オブジェクトモデルをxmlドキュメントを表すpojoにマップできます。次に、Marshallerを使用してキャスターで生成されたオブジェクトをStream、Stringなどに変換します。

于 2012-07-05T20:04:44.843 に答える