【问题标题】:MapStruct String to List mappingMapStruct 字符串到列表的映射
【发布时间】:2020-02-14 02:32:05
【问题描述】:

如何将 String 映射到 List 并将 List 映射到 String?

假设我们有以下类

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 的示例?

【问题讨论】:

    标签: java mapping mapstruct


    【解决方案1】:

    下面的示例将PeopleTOemailAddress 列表中的元素映射到PeopleprimaryEmailAddresssecondaryEmailAddress 属性中。

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

    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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我可以在这里看到一些例子: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/

      不确定是否可以将不可迭代对象映射到可迭代对象。

      【讨论】:

      • 它适用于一个字符串来列出映射,但我想将主要和辅助电子邮件地址映射到电子邮件地址列表,当我这样做时它会抛出相同的字段无法映射
      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 2019-07-03
      • 2020-09-04
      • 2023-03-10
      • 2019-12-06
      • 1970-01-01
      • 2018-08-06
      • 2019-08-20
      相关资源
      最近更新 更多