当前位置: 首页 > 知识库问答 >
问题:

MapStruct字符串到列表映射

冯渝
2023-03-14

如何将字符串映射到列表,并将列表映射到字符串?

考虑到我们有以下班级

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的更多示例

共有2个答案

彭华皓
2023-03-14

我可以在这里看到一些例子:https://github.com/mapstruct/mapstruct-examples

检查此模块以满足您的特定需求(可迭代到不可迭代):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。

顾兴昌
2023-03-14

下面的示例将PeopleTO中的emailAddress列表中的元素映射到People主EmailAddress次EmailAddress属性。

MapStruct不能直接映射到集合中,但它允许您实现在映射之后运行的方法来完成该过程。我使用了这样一种方法,将PeopleTO的primaryPhone和secondaryPhone属性映射到PeopleTO中的phones列表元素中。

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);
    }
}
 类似资料: