@Mapping QualifiedByName 在实现中被忽略/未找到

问题描述 投票:0回答:1

地图结构1.5.5

这会被映射器忽略:

@Mapping(source = "concepts.productId", target = "conceptType", qualifiedByName = "mapConceptType")

来源类:

@Data
public class Concept {
    private String name;
    private String productId;
    private String status;
    List<Product> products;
}

目标类别:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Concept {
    private String bankId;
    private String name;
    private ConceptType conceptType;
    private Pricing pricing;
    private List<RelatedProduct> products;
}

ConceptType 枚举:

public enum ConceptType {
    KEY_CUSTOMER, PREMIUM;
    private static Map<String, ConceptType> conceptTypeProductId;

    static {
        conceptTypeProductId = Map.of("KCPPRV10", KEY_CUSTOMER, "KCPPREMI", PREMIUM);
    }

    public static ConceptType getConceptType(String productId){
        return conceptTypeProductId.get(productId);
    }

}

地图绘制者:

@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface ConceptCatalogueToConceptDomain {
    @Mapping(source = "concepts.name", target = "name")
    @Mapping(source = "concepts.productId", target = "conceptType", qualifiedByName = "mapConceptType")
    @Mapping(source = "concepts.products.name", target = "products.name")
    @Mapping(source = "concepts.products.productId", target = "products.productId")
    @Mapping(source = "concepts.products.productPartId", target = "products.productPartId")
    @Mapping(source = "concepts.products.status", target = "products.status")
    @Mapping(source = "concepts.products.isMandatory", target = "products.isMandatory")
    List<Concept> toConceptFromCatalogue(@Context String bankId, List<core.customer.concept.mgmt.config.conceptcatalogue.dto.Concept> concepts);

    @Named("mapConceptType")
    default ConceptType mapConceptType(String productId){
        System.out.println("*****************Here: "+productId);
        return ConceptType.getConceptType(productId);
    }

    @AfterMapping
    default void updateSystemId(@MappingTarget List<Concept> concepts, @Context String bankId) {
        concepts.forEach(item -> item.setBankId(bankId));
    }
}

现在,生成的实现既没有conceptType限定符方法,测试也没有到达mapConceptType方法处放置的断点:


@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2024-02-12T12:24:05+0100",
    comments = "version: 1.5.5.Final, compiler: IncrementalProcessingEnvironment from gradle-language-java-8.6.jar, environment: Java 21.0.1 (Eclipse Adoptium)"
)
@Component
public class ConceptCatalogueToConceptDomainImpl implements ConceptCatalogueToConceptDomain {

    @Override
    public List<Concept> toConceptFromCatalogue(String bankId, List<core.customer.concept.mgmt.config.conceptcatalogue.dto.Concept> concepts) {
        if ( concepts == null ) {
            return null;
        }

        List<Concept> list = new ArrayList<Concept>( concepts.size() );
        for ( core.customer.concept.mgmt.config.conceptcatalogue.dto.Concept concept : concepts ) {
            list.add( conceptToConcept( concept, bankId ) );
        }

        updateSystemId( list, bankId );

        return list;
    }

    protected RelatedProduct productToRelatedProduct(Product product, String bankId) {
        if ( product == null ) {
            return null;
        }

        RelatedProduct relatedProduct = new RelatedProduct();

        relatedProduct.setName( product.getName() );
        relatedProduct.setSystemId( product.getSystemId() );
        relatedProduct.setProductId( product.getProductId() );
        relatedProduct.setProductPartId( product.getProductPartId() );
        relatedProduct.setMandatory( product.isMandatory() );

        return relatedProduct;
    }

    protected List<RelatedProduct> productListToRelatedProductList(List<Product> list, String bankId) {
        if ( list == null ) {
            return null;
        }

        List<RelatedProduct> list1 = new ArrayList<RelatedProduct>( list.size() );
        for ( Product product : list ) {
            list1.add( productToRelatedProduct( product, bankId ) );
        }

        return list1;
    }

    protected Concept conceptToConcept(core.customer.concept.mgmt.config.conceptcatalogue.dto.Concept concept, String bankId) {
        if ( concept == null ) {
            return null;
        }

        Concept concept1 = new Concept();

        concept1.setName( concept.getName() );
        concept1.setProducts( productListToRelatedProductList( concept.getProducts(), bankId ) );

        return concept1;
    }
}

我什至尝试使用表达式,但同样的问题:

@Mapping(target = "conceptType", expression = "java(mapConceptType(concept.getProductId()))")
mapstruct
1个回答
0
投票

也许这只是一个拼写错误,您在

product
映射中遗漏了
source
conceptType
(与
name
映射相同)。

恕我直言,你应该为单个项目重写

toConceptFromCatalogue
地图方法 然后添加可迭代映射以将单个项目映射与多个项目映射分开。

@Mapping(...)
@Mapping(...)
Concept toConceptFromCatalogue(@Context String bankId, core.customer.concept.mgmt.config.conceptcatalogue.dto.Concept concepts);

@AfterMapping
default void updateSystemId(@MappingTarget Concept concept, @Context String bankId) {
  concept.setBankId(bankId));
}

List<Concept> toConceptFromCatalogue(List<> source,@Context String bankId) {
  source.forEach(this::toConceptFromCatalogue);
}
© www.soinside.com 2019 - 2024. All rights reserved.