4

免責事項:同じ質問がすでにここで尋ねられています。ブルドーザーの中間コレクションを使用したディーププロパティのマッピングですが、受け入れられた答えはありません(私の場合は適切な答えがありません)。

だから質問。次のような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であると想定し、この時点から変換を行うカスタムコンバーターを作成することですが、どういうわけか、これは最善ではないと感じています。エレガントなソリューション。
この問題を解決する方法について他に何かアイデアはありますか?

4

1 に答える 1

3

たぶん私の答えはあなたに役立つかもしれません:

私はあなたがそのようなマッピングを書くことができると思います

<mapping>
  <class-a>Baz</class-a>
  <class-b>Target</class-b>
  <field>
    <a>foos</a>
    <b>fooStrings</b>
  </field>
</mapping>

<custom-converters> 
  <converter type="CustomFooConverter">
    <class-a>
      Foo
    </class-a>
    <class-b>
      String
    </class-b>
  </converter>
</custom-converters>

そして、CustomFooConverterを実装して、fooの文字列フィールドを取得し、それを文字列として返します。

プリミティブへのマッピングをサポートする機能リクエストを次のように投稿できると思います

<mapping>
  <class-a>Foo</class-a>
  <class-b>String</class-b>
  <field>
    <a>string</a>
  </field>
</mapping>

DozerGitHub

于 2013-01-09T14:50:23.797 に答える