如何用MapStruct将嵌套EntityPO映射至继承AIOwner的AICoBorrower?
解决方案:复用MapStruct基类映射实现子类嵌套对象映射
核心思路
利用MapStruct的@Mapper继承特性、嵌套属性路径表达式,以及uses属性复用已有的基类Mapper,直接将CoBorrowerPO中嵌套的EntityPO映射到继承自AIOwner的AICoBorrower,无需重复编写基类字段的映射规则,确保基类映射变更自动同步到子类。
步骤实现
1. 确认已有基类Mapper(AIOwnerMapper)
确保AIOwnerMapper已正确实现EntityPO到AIOwner的映射,示例代码:
@Mapper(componentModel = "spring") public interface AIOwnerMapper { AIOwnerMapper INSTANCE = Mappers.getMapper(AIOwnerMapper.class); @Mapping(source = "businessName", target = "name1") AIOwner entityPoToAiOwner(EntityPO entityPO); }
2. 定义子类Mapper(AICoBorrowerMapper)
通过@Mapper的uses属性引入AIOwnerMapper,并使用嵌套属性路径指定映射源,自动复用基类映射规则:
@Mapper(componentModel = "spring", uses = AIOwnerMapper.class) public interface AICoBorrowerMapper { AICoBorrowerMapper INSTANCE = Mappers.getMapper(AICoBorrowerMapper.class); // 直接映射嵌套的entityPO到AICoBorrower的基类字段 @Mapping(source = "entityPO", target = ".") AICoBorrower coBorrowerPoToAiCoBorrower(CoBorrowerPO coBorrowerPO); }
3. 关键特性说明
@Mapping(source = "entityPO", target = "."):将CoBorrowerPO中的entityPO对象字段,按照AIOwnerMapper的规则映射到AICoBorrower的对应字段(包括继承自AIOwner的firstName、name1)。uses = AIOwnerMapper.class:告知MapStruct复用该Mapper的映射逻辑,当AIOwnerMapper的规则(如新增字段、修改映射关系)变更时,AICoBorrowerMapper会自动同步,无需手动修改。- 继承映射自动生效:由于
AICoBorrower继承自AIOwner,MapStruct会自动识别基类字段的映射规则,无需在子类Mapper中重复编写@Mapping注解。
验证效果
传入CoBorrowerPO时,MapStruct会自动完成以下操作:
- 提取
CoBorrowerPO中的entityPO对象 - 调用
AIOwnerMapper.entityPoToAiOwner完成基类字段映射 - 将结果赋值给
AICoBorrower实例(包含所有继承字段)
这种方式既避免了重复代码,又保证了基类映射变更的自动同步,完全满足需求。
内容的提问来源于stack exchange,提问作者Sage Belknap
相关产品推荐
相关产品推荐

