MapStruct 指定子映射
MapStruct specifie sub mapping
这是我的例子。
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 个源和 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)
并从您的默认方法中调用它。
这是我的例子。
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 个源和 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)
并从您的默认方法中调用它。