Listに入れたBeanを更新できない
本日の実装作業中にタイトルに書いた理由で詰まってしまいました。
正確には、Beanが保持していたプロパティ値にnullが代入されるというものです。
以下に順を追って説明します。
- 何が起こったか?
まず、Dxoによる更新処理について説明します。
Dxoにおけるコンバートメソッドは、大きく分けて以下の2通りに宣言できます。
//パターン1.srcを元にFooBeanオブジェクトのインスタンスを作成する FooBean convertToFooBean(FooBean src); //パターン2.srcを元にdestを更新する void convertToFooBean(FooBean src, FooBean dest);
今回、一部のプロパティに値を保持するインスタンスに対して、追記(その他のプロパティの値を更新)することを目的とし、以下のようなコードを書き、Dxoを呼び出していました。
//Listの準備 List<FooBean> fooList1 = new ArrayList<FooBean>(); List<FooBean> fooList2 = new ArrayList<FooBean>(); //Beanの準備 FooBean foo1 = new FooBean(); FooBean foo2 = new FooBean(); foo1.setAaa(1); foo2.setBbb("hoge"); //ListにDtoを格納する fooList1.add(foo1); fooList2.add(foo2); //Listに入ったDtoを更新する testDxo.convertToFooBean(fooList1, fooList2);
上のコードの実行した結果、fooList2のBeanが保持していたプロパティBbbはnullとなり、代わりにAaaに1がセットされました。
要はfooList2のfoo1のプロパティ値が、foo2と同じ内容に変換されてしまいました。
- そもそも追記できるのか?
追記する、という動作をそもそも実現できるのかを、以下のコードで確認しました。
//Dxoの呼び出し元 //Dtoの準備 FooBean foo1 = new FooBean(); FooBean foo2 = new FooBean(); foo1.setAaa(1); foo2.setBbb("hoge"); //Dtoを更新する testDxo.convertToFooBean(foo1, foo2);
//Dxoの宣言 @ExcludeNull void convertToFooBean(FooBean src, FooBean dest);
上記のコードにより、foo2のBbbの値はそのままに、Aaaの値を追記することができました。
ですが実は、プロパティ値を追記するには、「@ExcludeNull」でコンバートメソッドを修飾する必要があります。
このアノテーションにより、null参照の変換元プロパティは、変換対象から外れます。つまり、変換先にnullが代入されなくなります。
従って、foo1のプロパティBbb(null参照)は、foo2にコピーされなくなります。
以上で、プロパティの追記 という動作は実現できることは確認できました。
- 結局どうしたのか?
結局、「@ExcludeNull」を利用しても、Listに入れたBeanに追記することはできませんでした。
を確認すると、「@ExcludeNull」の使い方に関して、以下のような説明があります
「変換元JavaBeansのプロパティまたはMapのマッピングの値がnullの場合は,変換先のJavaBeansまたはMapに値を設定しないことをアノテーションで指定することができます.」
上の赤文字の「変換元JavaBeans」には「Listに入ったJavaBeans」はあてはまらない、ということなのだと理解し、Dxo変換による更新はあきらめました。
この問題に関して、情報をお持ちの方からのコメントをお待ちしております。