先日、私が行った検証です。
上記のような2つのクラス間で、フィールド1, 2, 4(赤字)だけ複写して、複写先ClassDestのフィールド3については元の値を生かしたいという動作を実現させたかったのでした。
Javaマッピングフレームワークはお馴染みのDozerをチョイス。
使用したVersionはこちらです。
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.5.1</version> </dependency>
サンプル・コード
下記のようなコードで実現させようとしました。
xmlファイルで異なる名前のフィールド名のマッピング処理やフィールドの除外処理を定義できるようでしたが、今回は BeanMappingBuilderを使用。
BeanMappingBuilder builder = new BeanMappingBuilder() { @Override protected void configure() { mapping(ClassDest.class, ClassSource.class) .exclude("field3"); } }; private void edit(ClassSource cs) { ClassDest cd = fetchClassDest(cs.getField1()); DozerBeanMapper mapper = new DozerBeanMapper(); mapper.addMapping(builder); cd = mapper.map(cs, ClassDest.class); classDestFacade.edit(cd); }
動作結果
結果は、field3 の値が null になってしまいました!!
excludeでは、元の値を残すのではなく、型が初期化されてしまうことがわかりました。
私がやりたいことをDozer上で実現するのは難しいのでしょうか?
まだ理解が浅いので、もう少し調査してみようとは思いますが、いったん1つずつ項目をセットしたいと思います(敗北宣言)。
以上でーーす!