【问题标题】:MapStruct generator does not identify different mapping with 2 argumentsMapStruct 生成器不使用 2 个参数识别不同的映射
【发布时间】:2022-08-12 03:45:41
【问题描述】:
我有多种不同类型的 FooA、FooB、FooC、FooD、...
现在我需要将它们全部映射到“Dto”,在某些情况下,与 immutables.org 的集成可以完美地工作,但 MapStruct 的问题是它无法识别正确的映射方法:
class FooADto {
// foo A properties
FooBDto fooB;
FooCDto fooC;
}
class FooCDto {
// foo C properties
List<FooDDto> fooDs;
}
@Mapper(componentModel = \"spring\", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface DtoMapper {
FooADto toDto(FooA fooA, FooB fooB, FooC fooC, List<FooD> fooD)
FooCDto toDto(FooC fooC, List<FooD> fooD)
}
生成器现在生成方法来自己映射每种类型,但不重复使用将FooCDto 与FooDs 一起映射的第二种方法
是否有另一种方法可以使用expression = java(...) 来完成该 mapstruct 实现使用该方法?
标签:
java
spring
mapstruct
【解决方案1】:
解决方案1:
您可以为每个对象创建一个映射器,然后告诉 mapstruct 使用它。例子:
@Mapper(uses = {PatientMapper.class})
public interface DoctorMapper {
}
打开此mapstruct guide step-by-step 并转到“映射嵌套对象”部分。
也看看这个:guide-to-mapstruct-in-java-advanced-mapping-library section "Mapping Child Entities"
解决方案2:
MapStruct 不允许使用带有多个参数的qualifiedByName,因此您不能在您的情况下使用它。
但是如果你的 ENTITY 和 DTO 具有相同的结构,你可以将单个对象传递给映射器方法 toDto
FooADto toDto(FooA fooA)
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface DtoMapper {
@Mapping(target = "fooC", qualifiedByName = "toFooCDto")
FooADto toDto(FooA fooA)
@Named("toFooCDto")
default FooCDto toFooCDto(FooA fooA) {
//You can take fooC from fooA, and fooD from fooC
FooCDto fooCDto = new FooCDto();
//Add your custom mapping implementation
return fooCDto;
}
}