You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决MapStruct仅在expression中引用的uses配置Mapper未注入问题

问题原因

MapStruct 不会解析 @Mapping#expression 中编写的 Java 代码逻辑,仅会识别显式声明的映射关联依赖。你在表达式中调用的 transactionMapper 不会被 MapStruct 判定为有效依赖,因此即使写在 uses 配置中也不会自动生成注入逻辑,就会出现找不到变量的报错。

可行解决方案

方案1:用@Named + qualifiedByName替换表达式(最推荐)

完全贴合 MapStruct 设计规范,支持编译期校验,避免硬编码表达式的各种隐藏问题:

  1. 在 Mapper 中新增自定义转换方法,用@Named标记:
@Named("getPlayerTransaction")
default TransactionDto getPlayerTransaction(Game game, Long idPlayer) {
    return transactionMapper.transactionToDto(findTransactionForPlayer(game, idPlayer));
}
  1. 修改原@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:15:04