簡體   English   中英

如何在嵌套 Mapstruct 映射器中的模糊映射方法中指定 select?

[英]How to specify select among ambiguous mapping methods in nested Mapstruct mappers?

We have a particular case in which a Mapstruct mapper can choose between 2 different alternative methods from its dependency (namely ProductionPlanDetailAutoMapper), but, unable to do so, returns a compile error SupplyPlanProjectionAutoMapper.java Can't map map value "java.util.List<ProductionPlanDetail>" to "java.util.List<ProductionPlanDetailDTO> ". Consider to declare/implement a mapping method: "java.util.List<ProductionPlanDetailDTO> map(java.util.List<ProductionPlanDetail> value)". SupplyPlanProjectionAutoMapper.java Can't map map value "java.util.List<ProductionPlanDetail>" to "java.util.List<ProductionPlanDetailDTO> ". Consider to declare/implement a mapping method: "java.util.List<ProductionPlanDetailDTO> map(java.util.List<ProductionPlanDetail> value)".

源代碼由 2 個映射器組成:概述以及它們各自的代碼:

結構圖

映射器 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);
}

映射器 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")

盡管 Mapstruct 開發人員已經在文檔中沒有考慮過它。 在梳理文檔時,我發現了這個: valueQualifiedByName

解決方案是使用 MapMapping 並指定應使用 2 個 @Name 方法中的哪一個來填充 map 的 Values 部分(List(ProductionPlanDetail) 所在的位置):

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

這非常優雅地解決了這個問題。 另一方面,如果轉換問題存在於 map 密鑰中,則應改用 @MapMapping#keyQualifiedByName。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM