如何在MapStruct映射中调用自定义默认方法填充目标字段?
解决MapStruct中自定义方法映射到目标字段的问题
其实很简单,你只需要通过**@Named注解**配合@Mapping的qualifiedByName属性,就能让MapStruct明确调用你的自定义默认方法来填充指定目标字段。下面结合你的代码一步步说明:
步骤1:导入@Named注解
首先要引入MapStruct的@Named注解,用来标记你的自定义方法:
import org.mapstruct.Named;
步骤2:给自定义方法添加@Named标记
给每个带自定义逻辑的默认方法加上@Named注解,起一个唯一的标识名,方便后续引用:
@Named("mapLocation") default String locationToLocationDto(Item item) { return item.getItemsOnDetailedLocations().iterator().next().getLocation().getLocation(); } @Named("mapBinType") default double locationToBinType(Item item) { return item.getItemsOnDetailedLocations().iterator().next().getBinType(); } @Named("mapLotSize") default double itemToLotsize(Item item) { double lotSize = 0; if (item.getLotsize() != null) { lotSize = item.getLotsize(); } else if (item.getItemsOnDetailedLocations() != null && !item.getItemsOnDetailedLocations().isEmpty()) { ItemsOnDetailedLocation location = item.getItemsOnDetailedLocations().iterator().next(); lotSize = location.getLotSize(); } else { lotSize = 0.0; } return lotSize; } @Named("mapStockRails") default double stockRails(Item item) { double value = 0; for (ItemsOnDetailedLocation detailedLocation : item.getItemsOnDetailedLocations()) { if (detailedLocation.getId().getSource().equals("RAILS")) { long lotSize2 = detailedLocation.getLotSize(); long binInStock = detailedLocation.getBinInStock(); if (binInStock != 0) { value += lotSize2 * (binInStock - 0.5); } } } return value; }
步骤3:在@Mapping中关联方法和目标字段
在你的@Mappings数组里,添加新的@Mapping条目,用source = "."表示把整个源对象(Item)传递给自定义方法,再用qualifiedByName指定你刚才标记的方法名,最后绑定到对应的目标字段(注意目标字段要和ItemViewModel中的字段名一致):
@Mappings({ // 你的原有映射配置... @Mapping(source = ".", target = "location", qualifiedByName = "mapLocation"), @Mapping(source = ".", target = "binType", qualifiedByName = "mapBinType"), @Mapping(source = ".", target = "lotSize", qualifiedByName = "mapLotSize"), @Mapping(source = ".", target = "stockRails", qualifiedByName = "mapStockRails") }) ItemViewModel itemToDto(Item item);
关键说明
source = "."的作用:因为你的自定义方法接收的是整个Item对象作为参数,而不是Item的某个具体字段,所以用"."表示将整个源实例传递给方法。- 类型匹配:确保自定义方法的返回类型和目标字段的类型完全一致(比如你的
mapBinType返回double,目标字段binType也必须是double类型),否则MapStruct会报错。 - 避免歧义:如果有多个方法可以匹配同一个字段类型,@Named和qualifiedByName的组合能明确告诉MapStruct该用哪个方法,不会出现自动匹配混乱的问题。
这样配置后,MapStruct在生成映射代码时,就会自动调用这些自定义方法来填充对应的目标字段啦!
内容的提问来源于stack exchange,提问作者JimmyD
相关产品推荐
相关产品推荐

