【问题标题】: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)
}

生成器现在生成方法来自己映射每种类型,但不重复使用FooCDtoFooDs 一起映射的第二种方法

是否有另一种方法可以使用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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2022-10-15
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2019-12-03
      相关资源
      最近更新 更多