4

Dozerで 1 つのフィールドをList/Collectionにどのようにマッピングしますか?

class SrcFoo {
    private String id;
    private List<SrcBar> bars;
}

class SrcBar {
    private String name;
}

ここに私の宛先オブジェクトがあります:

class DestFoo {
    private List<DestBar> destBars;
}

class DestBar {
    private String fooId; // Populated by SrcFoo.id
    private String barName;
}

すべてDestBar.fooId(DestBars のリスト全体) にデータを入力したいSrcFoo.id

この質問は、ここに投稿されたものと似ています。単一のフィールドをリスト内のすべてのアイテムにマップしたいと考えています。Dozer: 単一フィールドを Set にマップする

次のことを試しましたがDestBar.fooId、リストの最初の項目にしか入力されませんでした。

<mapping> 
     <class-a>SrcFoo</class-a> 
     <class-b>DestFoo</class-b> 
     <field>
         <a>bars</a>
         <b>destBars</b>
     </field> 
     <field>
         <a>id</a>
         <b>destBars.fooId</b> <!-- same affect as destBars[0].fooId ? -->
     </field> 
</mapping>
4

1 に答える 1

3

Dozer はそのタイプのマッピングをサポートしていません。そのタイプのマッピングを行うには、コレクションのインデックスを知る必要があります (静的マッピング)。これはカスタム コンバーターのジョブです。文字列からリスト (DestBar の) へのコンバーターを次のように作成します。

public class YourConverter extends DozerConverter<String, List>

コンバーターにマッピング ロジックを実装し (必要に応じて文字列 ID を設定するだけです)、ドーザー ファイルを次のように構成します。

<mapping> 
     <class-a>SrcFoo</class-a> 
     <class-b>DestFoo</class-b> 
     ...
     <field custom-converter="yourpackage.YourConverter">
         <a>id</a>
         <b>destBars</b>
     </field> 
</mapping>
于 2012-08-06T16:41:47.477 に答える