如何解决MapStruct仅在expression中引用的uses配置Mapper未注入问题
问题原因
MapStruct 不会解析 @Mapping#expression 中编写的 Java 代码逻辑,仅会识别显式声明的映射关联依赖。你在表达式中调用的 transactionMapper 不会被 MapStruct 判定为有效依赖,因此即使写在 uses 配置中也不会自动生成注入逻辑,就会出现找不到变量的报错。
可行解决方案
方案1:用@Named + qualifiedByName替换表达式(最推荐)
完全贴合 MapStruct 设计规范,支持编译期校验,避免硬编码表达式的各种隐藏问题:
- 在 Mapper 中新增自定义转换方法,用
@Named标记:
@Named("getPlayerTransaction") default TransactionDto getPlayerTransaction(Game game, Long idPlayer) { return transactionMapper.transactionToDto(findTransactionForPlayer(game, idPlayer)); }
- 修改原
@Mapping注解,替换expression配置:
// 多参数场景下MapStruct 1.5+会自动匹配方法参数顺序和类型 @Mapping(target = "transaction", qualifiedByName = "getPlayerTransaction") GameResultDto gameToGameResultDto(Game game, Long idPlayer);
此时MapStruct会自动识别到方法内用到了TransactionMapper,自动生成注入逻辑。
方案2:新增空转换方法强制引入依赖(快速兼容)
如果不想改动原有表达式逻辑,可以在GameMapper中新增一个无业务意义的空转换方法,让MapStruct识别到TransactionMapper的依赖:
// 不需要手动实现,MapStruct会自动调用TransactionMapper的对应方法生成实现 TransactionDto map(Transaction transaction);
只要方法签名和TransactionMapper中的转换方法匹配,MapStruct就会判定该Mapper被使用,生成对应的注入代码。
内容的提问来源于stack exchange,提问作者luthier
相关产品推荐
相关产品推荐

