地图结构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()))")
也许这只是一个拼写错误,您在
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);
}