MapStruct指定子映射

问题描述 投票:0回答:1

这是我的榜样。

public class Company {
    ....
    private String companyName;
    ....
}

public class Employee {
    ....
    private String name;
    ....
}

public class EmployeeDto {
    ....
    private String name;
    private String companyName;
    ....
}

@Mapper(componentModel = "spring")
public interface EmployeeDtoMapper {

    @Mapping(target = "name", source = "source1.name")
    @Mapping(target = "companyName", source = "source2.companyName")
    EmployeeDto toDto(Employee source1, Company source2);

    List<EmployeeDto> toDtos(List<Employee> sources, @Context Company source2);

}

我希望方法toDtos使用toDto将Employee映射到EmployeeDto,但mapstruct生成employeeDtoToEmployeeDto方法。我该如何解决?

谢谢

mapstruct
1个回答
0
投票

Mapstruct仅允许基于1个源和1个目标选择子映射。因此@Context注释。这将有效地忽略该参数,只将其传递给子映射。

但是......你可以像这样解决你的问题..

@Mapper(componentModel = "spring")
public interface EmployeeDtoMapper {

    @Mapping(target = "name", source = "source1.name")
    EmployeeDto toDto(Employee source1, @Context Company source2);

    @AfterMapping
    default afterToDto(@MappingTarget EmployeeDto target, @Context Company source2) {
       target.setCompanyName( source2.getCompanyName();
    }

    List<EmployeeDto> toDtos(List<Employee> sources, @Context Company source2);

}

请注意,如果映射source2中有多个参数,并且您也希望使用MapStruct,则可以定义映射EmployDTO toDo(Company source)的新接口方法,并从默认方法中调用它。

© www.soinside.com 2019 - 2024. All rights reserved.