免責事項:同じ質問がすでにここで尋ねられています。ブルドーザーの中間コレクションを使用したディーププロパティのマッピングですが、受け入れられた答えはありません(私の場合は適切な答えがありません)。
だから質問。次のようなComplexObjectで構成されたレルムがあります
public class ComplexObject {
private Set<AnotherComplexObject> inner;
... //other fields, setters and getters
}
public Class AnotherComplexObject {
private String property;
... //other fields, setters and getters
}
今、私はにマッピングComplexObject
しています。Target
ここで、TargetにはSet<String>
プロパティがあります。
public class Target {
private Set<String> targetString;
... //other fields, setters and getters
}
各ComplexObjectinner.propertyを1つのTargettargetStringにマップしたいと思います。セマンティックに見えるもの(これはもちろん機能しません。プロパティはSetのメンバーではなく、DozerはMappingExceptionを生成します):
<mapping>
<class-a>ComplexObject</class-a>
<class-b>Target</class-b>
<field>
<a>inner.property</a>
<b>targetString</b>
</field>
</mapping>
toString
の方法AnotherComplexObject
を
変更すれば目標を達成できます
public class AnotherComplexObject {
public String toString(){
return property;
}
}
次に、Dozerは、ソースセットが「タイプ」AnotherComplexObjectであり、ターゲットセットがStringであることを検出し、変換中にメソッドtoStringを使用します。残念ながら、これは完全な解決策ではありません。Dozerに変換を実行させるためだけに、POJOにメソッドが必要になるからです。
動作するのは、変換メソッドをオーバーライドしてソースがセットであるかどうかをチェックし、セット内のオブジェクトがAnotherComplexObjectであると想定し、この時点から変換を行うカスタムコンバーターを作成することですが、どういうわけか、これは最善ではないと感じています。エレガントなソリューション。
この問題を解決する方法について他に何かアイデアはありますか?