MapStruct继承与this调用问题:如何整合子Mapper实现实体映射
MapStruct多子Mapper整合不生效问题解决办法
核心原因
MapStruct默认只有在源对象的字段名和目标对象的字段名匹配时,才会自动调用uses属性引入的子Mapper。你当前的场景是目标对象的子字段(比如engineConfiguration)需要从整个CarsEntity源对象转换而来,而非CarsEntity内部的某个同名子字段,因此MapStruct无法自动匹配触发子Mapper调用。
推荐解决方案:显式指定source为源对象本身
不需要手动写expression,用MapStruct内置的source = "."语法即可实现将整个源对象作为入参传递给对应子Mapper,代码示例如下:
@Mapper(componentModel = "spring", uses = { EngineConfigurationMapper.class, ModelMetadataMapper.class, BodyConfigurationMapper.class }) public interface BMWMapper { @Mapping(target = "engineConfiguration", source = ".") @Mapping(target = "modelMetadata", source = ".") @Mapping(target = "bodyConfiguration", source = ".") BMW mapToDomain(CarsEntity carsEntity); }
source = "."表示将当前方法的整个入参CarsEntity对象,作为入参传递给目标字段对应类型的转换方法,MapStruct会自动从uses引入的Mapper中查找匹配的转换方法调用,不需要手动指定Mapper的方法名。
特殊场景下Expression写法修正
如果确实需要用expression实现自定义逻辑,需修正你之前的错误写法:
- 表达式需要用
java()包裹 - 入参是你方法的入参名
carsEntity,而非this(this指代当前Mapper实例,不是源对象)
@Mapping(target = "engineConfiguration", expression = "java(engineConfigurationMapper.mapToDomain(carsEntity))")
常见排查项
- 确保所有Mapper都正确配置
componentModel = "spring",否则Spring无法注入子Mapper实例 - 确保编译配置中正确引入了MapStruct注解处理器,否则不会生成正确的实现类代码
- 不要手动给Mapper接口加
@Component等注解,MapStruct生成的实现类会自动携带对应注解
内容的提问来源于stack exchange,提问作者2dor
相关产品推荐
相关产品推荐

