web-dev-qa-db-ja.com

MapStruct文字列からリストへのマッピング

文字列をリストに、リストを文字列にマッピングするにはどうすればよいですか?

次のクラスがあるとします

class People{
    private String primaryEmailAddress;
    private String secondaryEmailAddress;
    private List<String> phones;
    //getter and setters
}

class PeopleTO{
    private List<String> emailAddress;
    private String primaryPhone;
    private String secondaryPhone;
    //getter and setters
}

DozerとOrikaでは、次のコード行で簡単にマッピングできます

fields("primaryEmailAddress", "emailAddress[0]")
fields("secondaryEmailAddress", "emailAddress[1]")

fields("phones[0]", "primaryPhone")
fields("phones[1]", "secondaryPhone")

MapStructで同じ種類のマッピングを行うにはどうすればよいですか? mapstructの他の例はどこにありますか?

13
suresh

以下の例は、emailAddressPeopleTOリストの要素を、primaryEmailAddresssecondaryEmailAddressおよびPeopleプロパティにマッピングします。

MapStructを直接コレクションにマップすることはできませんが、マッピング後に実行するメソッドを実装してプロセスを完了することができます。 primaryPhonesecondaryPhoneプロパティとPeopleTOプロパティをphonesPeopleリストの要素にマッピングするために、そのような方法の1つを使用しました。

abstract class Mapper {
    @Mappings({
        @Mapping(target="primaryEmailAddress", expression="emailAddress != null && emailAdress.size() >= 1 ? emailAdresses.get(0) : null"),
        @Mapping(target="secondaryEmailAddress", expression="emailAddress != null && emailAdress.size() >= 2 ? emailAdresses.get(1) : null"),
        @Mapping(target="phones", ignore=true)
    })
    protected abstract People getPeople(PeopleTO to);

    @AfterMapping
    protected void setPhones(PeopleTO to, @MappingTarget People people) {
        people.setPhones(new List<String>());
        people.getPhones().add(to.primaryPhone);
        people.getPhones().add(to.secondaryPhone);
    }
}
13
lpacheco

私はここにいくつかの例を見ることができました: https://github.com/mapstruct/mapstruct-examples

特定の要件(IterableからNon-Iterableまで)についてこのモジュールをチェックアウトしてください: https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable

そしてもう一つはここに: http://blog.goyello.com/2015/09/08/dont-get-lost-take-the-map-dto-survival-code/

非iterableをIterableにマッピングできるかどうかは不明です。

2
Vijay