6

私たちのプロジェクトでは、Bean のネストされた構造を別の構造にマッピングする必要があります。(これらは実際には、XML ドキュメントの JAXB マップ Java 表現であり、たとえば、受注ドキュメントを表します。) これは、別のシステムのまったく異なる注文ドキュメント構造にマップする必要があります。

これを行うためのオプションは何ですか?以下の条件を満たすものを希望します。

  1. 1つのフィールドのマッピングが定義されていない場合、マッピングは私に警告する必要があります
  2. マッピングには、同じ名前のフィールドを相互にマッピングし、int から String へ、またはその逆の標準マッピングを提供するなど、いくつかのデフォルトが必要です。
  3. マッピングは双方向である必要があります。
  4. マッピングを定義するときにコード補完を使用できるはずです。

このための有望なフレームワークはDozerですが、1 と 4 を満たしていません。 JBeanMapperと同じです。Java でプログラミングするだけで 4 が実行されますが、他の要件は実行されません。XSLT を使用すると、おそらく 2 つが満たされますが、他には何もありません。もっと良いアイデアはありますか?

4

7 に答える 7

5

ModelMapperは、すべての基準を満たす唯一のライブラリです。実際のコードを使用してプロパティをマッピングするマッピング API を提供するため、コード補完が得られます。また、すべての宛先プロパティがマップされていることを確認するための検証も提供します。さらに、インテリジェントなマッピングなど、あなたが望んでいることさえ知らなかったいくつかのことを提供します:)

詳細については、ModelMapper のホームページをご覧ください。

http://modelmapper.org

于 2011-06-24T05:54:04.110 に答える
3

もう 1 つの代替手段は、ビルド時にマッピング コードを生成するMapStructであり、実行時に依存関係を必要としないタイプ セーフなマッピングになります (免責事項: 私は MapStruct の作成者です)。

于 2013-06-07T19:04:08.353 に答える
1

この問題が発生したとき、ユーティリティ クラスで Java のフィールド マッピングを行うことになりました。特に、いくつかの異なる Web サービスにマップする必要があり、それぞれのマッピングを作成する必要がある場合は、本当に面倒です (そのうちのいくつかは、オブジェクトの階層ではなく、名前付き属性の単純な 2D マップです)。

ただし、そのようにして、マッピングのターゲットの要件を分析して、最高品質のマッピングを取得したり、データが設定されていない場所にデフォルトを設定したりすることができます。必要に応じて、マッパーでカスタムの「UndefinedMappingException」をスローできます。また、リフレクションや複雑な XML マッピング構成ファイルを使用するふわふわしたライブラリではないため、非常に高速です。

つまり、これは「Java で書く」ことを主張する投稿です。

于 2008-12-17T11:58:07.180 に答える
1

commons-beanutilsで同様の問題を解決しました。

私の最終的な目標は、データ構造を構築する大きな Java ファイルで、マッパーがそのファイルを作成してくれました。このようにして、プログラムの実行中に作成されたスナップショットからテスト データを作成できました。

マッパーは、オブジェクトをソートするためのキー、Java ファイルでオブジェクト名を生成するために使用するフィールドを定義することを許可し、「class:field」をキーとしてマップを使用しました。値は、単純な「マッピング」インターフェース (1 つのメソッド: toJava(Object instance, String field, Object value)) を実装するオブジェクトでした。

私の主な問題は、2MB以上のJavaファイルをコンパイルすることでした:)

于 2008-12-17T12:07:58.830 に答える
1

Transmorph、EZMorph、Dozer、OTOM は、Bean から Bean へのマッピングで確認できるものの一部です。私は過去に Dozer を使用していましたが、何年にもわたって非常に安定していると感じています。

于 2011-05-18T21:35:12.297 に答える
0

わずかに異なるバリアントが多数あるデータ構造をマッピングする場合に役立つ興味深いソリューションがあります。たとえば、さまざまなビジネス ケースと製品バリアントのビジネス注文構造をモデル化しており、異なるバリアントでは、住所、アカウント ID、製品の構成情報などの同じ属性のさまざまな組み合わせが必要な場合があります。

したがって、多くの属性の異なるサブセットを含む、構造的に類似した多くの Bean があります。個々のバリアントごとにコードを記述したくない場合は、これらの Bean で発生するすべての属性を持つ Java インターフェースを導入し、java.lang.reflect.Proxyを使用して、マップする Bean のプロキシ インスタンスを構築できます。 、実際の Bean に存在しないセッターが実際の Bean で呼び出された場合に例外をスローします。いわば、Bean 自体よりも多くのメソッドを持つ Bean にインターフェイスを注入します。

于 2011-01-06T11:31:28.780 に答える