Mapstruct 映射列表到包含列表的对象

Mapstruct map list to an object containing list

我想要从对象列表到包含列表的对象的双向映射。

class Person {
  String firstName;
  String lastName;
}

class Group { // Source
  List<Person> people;
  String groupID; 
  ...
}

class Employee { // target
  String firstName;
  String lastName;
  String employeeNumber;
  ...
}

我用ReportingPolicy.IGNORED忽略了所有不相关的字段。我只想要 Group 到 List 之间的映射,其中包含字段 firstName 和 lastName。

有可能吗?我试过了,但它在构建过程中给了我错误“不可能将可迭代映射到不可迭代。”

@Mapping(target="people", source".")
Group map(List<Employee>)

Mapstruct 不支持这种映射。有关此问题,请参阅 Mapstruct 贡献者 answer
像解决方法一样,您可以实现自己的映射方法以转换为包装 class.

@org.mapstruct.Mapper
public interface Mapper {
    List<Person> map(List<Employee> employees);

    Person map(Employee employee);

    default Group mapGroup(List<Employee> employees) {
        Group group = new Group();
        group.people = map(employees);
        return group;
    }
}

MapStruct 支持从源参数到目标参数的映射。这意味着您可以配置 MapStruct 以将源列表参数映射到目标列表 属性。但是,正如 中所指出的,不可能将单个集合参数映射到目标参数。它工作的唯一方法是如果有多个源参数。

例如

@Mapper
public interface Mapper {

    @Mapping(target = "people", source = "employees")
    @Mapping(target = "groupID", source = "groupId")
    Group map(String groupId, List<Employee> employees);

}