Как указать выбор среди неоднозначных методов сопоставления во вложенных картографах Mapstruct? - PullRequest
1 голос
/ 14 июля 2020
• 1000 code состоит из 2 карт: представлен обзор, а также их соответствующие коды:

Диаграмма Mapstruct

Mapper 1:

@Mapper(componentModel = "spring", uses={ProductionPlanDetailAutoMapper.class}) 
public interface SupplyPlanProjectionAutoMapper {

    @Mapping(source = "material.id", target = "materialId")
    public PlanningProjectionDTO convert(PlanningProjection);
    
    public Map<PlanningProjectionDTO, List<ProductionPlanDetailDTO>> convertMapProductionPlanDetail (Map<PlanningProjection, List<ProductionPlanDetail>> map);
}

Mapper 2:

@Mapper(componentModel = "spring", uses={RecipeAutoMapper.class})
public interface ProductionPlanDetailAutoMapper {
    
    @Mapping(source = "location.id", target = "locationId")
    @Mapping(source = "receitaProducaoOperacao", target = "productionRecipeOperation")
    @Mapping(source = "dataReferencia", target = "referenceDate")
    @Named(value = "convertWithRecipeDetail")
    public ProductionPlanDetailDTO convertWithRecipeDetail(ProductionPlanDetail);
                
    @Mapping(source = "receitaProducaoOperacao.listaTecnica.materialOutput.id", target = "outputMaterialId")
    @Mapping(source = "receitaProducaoOperacao.listaTecnica.id", target = "billOfMaterialsId")
    @Mapping(source = "receitaProducaoOperacao.receitaProducaoOperacaoCompositeKey.receitaProducao.id", target = "productionRecipeId")
    @Mapping(source = "receitaProducaoOperacao.recursoProdutivo.id", target = "productionResourceId")
    @Mapping(source = "receitaProducaoOperacao.receitaProducaoOperacaoCompositeKey.posicaoOperacao", target = "productionRecipeOperationSequence")
    @Mapping(source = "location.id", target = "locationId")
    @Mapping(source = "dataReferencia", target = "referenceDate")
    @Named(value = "convertWithoutRecipeDetail") 
    public ProductionPlanDetailDTO convertWithoutRecipeDetail(ProductionPlanDetail productionPlanDetail);

    @Named(value = "convertToListWithRecipeDetail") 
    @IterableMapping(qualifiedByName = "convertWithRecipeDetail") 
    public List<ProductionPlanDetailDTO> convertToDTOListWithRecipeDetail (List<ProductionPlanDetail> productionPlanDetailList);
    
    @Named(value = "convertToListWithoutRecipeDetail") 
    @IterableMapping(qualifiedByName = "convertWithoutRecipeDetail") 
    public List<ProductionPlanDetailDTO> convertToDTOListWithoutRecipeDetail (List<ProductionPlanDetail> productionPlanDetailList);
}

Неоднозначности между методами внутри второго сопоставителя разрешаются объединением @Name и @ IterableMapping # QualifiedByName

Мы попробовали тот же метод, добавив аннотацию ниже к методу convertMapProductionPlanDetail, но безрезультатно:

@IterableMapping(qualifiedByName = "convertToListWithRecipeDetail")

1 Ответ

1 голос
/ 15 июля 2020

Хотя в документации и нет, разработчики Mapstruct уже подумали об этом. Изучая документацию, я обнаружил следующее: valueQualifiedByName

Решением было использовать MapMapping и указать, какой из 2 методов @Name следует использовать для заполнения раздела значений (где List ( ProductionPlanDetail) находится) на карте:

@MapMapping(valueQualifiedByName = "convertToDTOListWithRecipeDetail")
public Map<PlanningProjectionDTO, List<ProductionPlanDetailDTO>> convertMapProductionPlanDetail (Map<PlanningProjection, List<ProductionPlanDetail>> map);

Что довольно элегантно решает проблему. С другой стороны, если проблема преобразования возникла в ключе карты, вместо него следует использовать @ MapMapping # keyQualifiedByName.

...