【问题标题】:MapStruct specifie sub mappingMapStruct 指定子映射
【发布时间】:2019-02-24 04:31:59
【问题描述】:

这是我的例子。

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】:

    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) 并从您的默认方法中调用它。

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 2018-09-06
      • 2018-07-09
      • 2020-08-02
      • 2020-05-10
      • 2023-03-29
      • 1970-01-01
      • 2021-11-22
      • 2015-11-12
      相关资源
      最近更新 更多