Javaオブジェクトからオブジェクトへのマッピングのためのツールはありますか?[閉まっている]


231

私は、Javaを使用してDOをDTOに変換しようとしています。独自のツールを作成する前に、自動化ツールを探しています。私は同じために利用できる無料のツールがあるかどうか知りたかっただけです。


1
ジャクソン(JSONライブラリ)にはメソッドがありnew ObjectMapper().convertValue(...)ます。ジャクソンはアノテーションとアノテーションミックスインもサポートしているので、とても良いオプションだと思います。
Simon Forsberg、2017

1
これは、異なるフレームワークとパフォーマンスの比較に関する記事です。baeldung.com/java-performance-mapping-frameworks
クリスチャン

回答:


105

Dozerを試すことができます。

Dozerは、あるオブジェクトから別のオブジェクトにデータを再帰的にコピーするJava BeanからJava Beanへのマッパーです。通常、これらのJava Beanはさまざまな複合型になります。

Dozerは、単純なプロパティマッピング、複合型マッピング、双方向マッピング、暗黙的明示的マッピング、および再帰的マッピングをサポートしています。これには、要素レベルでもマッピングが必要なコレクション属性のマッピングが含まれます。


24
非常に長い時間が経過した後、更新を行います。コメントが読まれることを願っています。Dozerは死んでいるようで、MapStructを使用することをお勧めします。簡単(注釈をサポート)、高速(リフレクションなし)です。 )、(現時点では)安全なようです。これは@Pascal Thiventリストに含まれていますが、私はそれをアドバイスします(ロンボクと一緒に使用することでいくつかの問題があったとしても)。
Alex


394

周辺にはいくつかのライブラリがあります:

  • Commons-BeanUtils:ConvertUtils->文字列スカラー値を指定したクラスのオブジェクトに、文字列配列を指定したクラスの配列に変換するためのユーティリティメソッド。

  • Commons-Lang:ArrayUtils->配列、プリミティブ配列(int []など)、およびプリミティブラッパー配列(Integer []など)に対する操作。

  • Springフレームワーク:Springは、PropertyEditorsの優れたサポートを備えています。これを使用して、オブジェクトを文字列に、または文字列から変換することもできます。

  • Dozer:Dozerは、強力でありながらシンプルなJava BeanからJava Beanへのマッパーで、オブジェクト間でデータを再帰的にコピーします。通常、これらのJava Beanはさまざまな複合型になります。

  • ModelMapper:ModelMapperは、オブジェクトを相互に自動的にマップするインテリジェントオブジェクトマッピングフレームワークです。特定のユースケースを処理するための単純なリファクタリングセーフAPIを提供しながら、オブジェクトをマップするための規則ベースのアプローチを使用します。

  • MapStruct:MapStructは、Beanマッピング用のコンパイル時コードジェネレーターであり、実行時に高速(リフレクションなどを使用しない)、依存性がなくタイプセーフなマッピングコードを生成します。

  • Orika:Orikaはバイトコード生成を使用して、最小限のオーバーヘッドで高速マッパーを作成します。

  • Selma:マッピング用のコンパイル時コードジェネレーター

  • JMapper:アノテーション、XML、またはAPIを使用したBeanマッパーの生成(死んだようです、最終更新は2年前)

  • Smooks:Smooks JavaBean Cartridgeを使用すると、メッセージデータ(つまりデータのバインド先)からJavaオブジェクトを作成してデータを設定できます(コメントでsuperfilinが推奨)。(現在、活発な開発は行われていません)

  • Commons-Convert:Commons-Convertは、あるタイプのオブジェクトを別のタイプのオブジェクトに変換するタスク専用の単一のライブラリを提供することを目的としています。最初の段階では、オブジェクトから文字列への変換と文字列からオブジェクトへの変換に焦点を当てます。(死んだようです、最終更新2010)

  • Transmorph:Transmorphは、あるタイプのJavaオブジェクトを別のタイプのオブジェクトに変換するために使用される無料のJavaライブラリーです(別のシグニチャーを使用して、パラメーター化されている可能性があります)。(死んだようです、最終更新2013)

  • EZMorph:EZMorphは、オブジェクトを別のオブジェクトに変換するためのシンプルなJavaライブラリです。プリミティブとオブジェクトの変換、多次元配列とDynaBeansを使用した変換をサポートします(死んだようですが、最終更新は2008年)。

  • Morph:Morphは、アプリケーションの内部相互運用性を容易にするJavaフレームワークです。情報がアプリケーションを通過するときに、複数の変換が行われます。モーフは、これらの変換を実装する標準的な方法を提供します。(死んだようです、最終更新2008)

  • Lorentz:Lorentzは、一般的なオブジェクトからオブジェクトへの変換フレームワークです。あるタイプのJavaオブジェクトを別のタイプのオブジェクトに変換する単純なAPIを提供します。(死んだようです)

  • OTOM:OTOMを使用すると、任意のデータを任意のオブジェクトから任意の他のオブジェクトにコピーできます。可能性は無限大。「秋」へようこそ。(死んだようです)


どの

1
Commons-Convertは休止状態であるだけでなく、完全になくなったようです...
ジムフェラン

実際、もしあなたのリストにMooを追加したいのであれば、私の答えを削除することができます。あなたの答えが明らかに完全であるためです。;)
ジェフリーワイズマン

3
Java 8+の別のオプション:erchu.github.io/bean-cp(免責事項:私はこのプロジェクトの作成者です)
Rafal

1
@TmTron:完了し、私はストライキを削除してレポURLを参照するように回答を編集しました(メインページはまだ0.7.5を参照しているため)
patric.schenke 2017年

31

もう一つはオリカです-https ://github.com/orika-mapper/orika

Orikaは、あるオブジェクトから別のオブジェクトに(他の機能とともに)データを再帰的にコピーするJava Beanマッピングフレームワークです。これは、多層アプリケーションを開発するときに非常に役立ちます。

Orikaは、可能な限り自動化に焦点を当て、必要に応じて構成と拡張によるカスタマイズを提供します。

Orikaにより、開発者は次のことが可能になります。

  • 複雑で深く構造化されたオブジェクトをマッピングする
  • ネストされたプロパティを最上位のプロパティに、またはその逆にマッピングすることにより、「フラット」または「拡張」オブジェクト
  • オンザフライでマッパーを作成し、カスタマイズを適用してマッピングの一部またはすべてを制御します
  • タイプごと、または特定のプロパティ名によって、オブジェクトグラフ内の任意の場所にある特定のオブジェクトセットのマッピングを完全に制御するためのコンバーターを作成する
  • プロキシまたは拡張オブジェクト(Hibernateのオブジェクトやさまざまなモックフレームワークなど)を処理する
  • 1つの構成で双方向マッピングを適用する
  • ターゲットの抽象クラスまたはインターフェースの適切な具象クラスのインスタンスにマップします
  • 逆マッピングを処理する
  • JavaBeanの仕様を超えた複雑な規則を処理します。

Orikaはバイトコード生成を使用して、最小限のオーバーヘッドで高速マッパーを作成します。


2
あなたはオリカについていくつかの単語を提供することができます-他人からそれは違う何か
Olimpiu POP

それはおそらくドーザーよりもはるかに高速です-ドーザーは静かに遅いです。
Ondrej Bozek

21

ModelMapperは、チェックする価値のある別のライブラリです。ModelMapperの設計は、以下の点で他のライブラリとは異なります。

  • ソースと宛先のプロパティをインテリジェントに一致させることにより、オブジェクトモデルを自動的にマッピングします
  • 文字列を使用するのではなく、実際のコードを使用してフィールドとメソッドをマップするリファクタリングセーフマッピングAPIを提供します
  • 慣習に基づいた構成を利用して、カスタムシナリオを簡単に処理

詳細については、ModelMapperサイトをご覧ください。

http://modelmapper.org


13

Apache commons beanutilsを使用します。

static void copyProperties(Object dest, Object orig) -プロパティ名が同じであるすべてのケースで、プロパティ値を関連元Beanから宛先Beanにコピーします。

http://commons.apache.org/proper/commons-beanutils/


3
ええ、でもソースBeanにあるが宛先Beanにないプロパティは単に無視されます。とにかくPablojim :) DOとDTOのプロパティ名が異なるため、Dozerを使用する必要があると思います:(
ravinikam

1
十分に公平-私はこれを知りませんでした...パスカルのリストはかなり印象的でした!
パブロジム2009


3

JMapper Frameworkを試すことをお勧めします。

これはJava BeanからJava Beanへのマッパーであり、注釈やXMLを使用してデータの通過を動的に実行できます。

JMapperでできること:

  • ターゲットオブジェクトを作成して充実させる
  • 特定のロジックをマッピングに適用する
  • XMLファイルを自動的に管理する
  • 1対NおよびN対1の関係を実装する
  • 明示的な変換を実装する
  • 継承された構成を適用する

2

Mooをオプションとして追加できてうれしいですが、明らかにそれに偏っています:http : //geoffreywiseman.github.com/Moo/

単純なケースには非常に使いやすく、より複雑なケースには適度に対応できますが、さらに複雑にするために拡張することを想像できる領域がまだいくつかあります。


2

Dozerベースのマッピングフレームワークを試すこともできますが、Excelマッピング宣言を使用します。彼らはいくつかのツールと追加のクールな機能を持っています。http://openl-tablets.sf.net/mapperで確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.