MapStruct使用@Context注入仓库时出现限定符匹配错误求助
MapStruct @Context 参数导致 Qualifier 错误的解决办法
问题本质
你遇到的编译错误核心在于MapStruct匹配@Named("getEnumDefinition")标注方法时的参数逻辑:
- 当映射方法传入
@Context参数时,MapStruct要求对应的转换方法(即qualifiedByName指定的方法)必须将该参数标注为@Context,否则会把它当成普通参数,导致参数数量不匹配(期望仅1个String参数,实际找到带两个参数的方法)。 - 移除
@Context后编译正常,是因为此时转换方法和映射方法的参数数量一致(仅String参数),MapStruct能正确匹配。
正确实现步骤
转换方法必须标注@Context参数
确保你的枚举转换方法,把IEnumDefinitionDao参数标记为@Context,示例:@Named("getEnumDefinition") public String getEnumValue(String code, @Context IEnumDefinitionDao enumDao) { // 调用enumDao获取枚举定义的逻辑 return enumDao.getEnumNameByCode(code); }Mapper接口的映射方法传入@Context参数
在EnumValueMapper接口中,映射方法需要显式传入@Context修饰的IEnumDefinitionDao,示例:@Mapper public interface EnumValueMapper { EnumValueMapper INSTANCE = Mappers.getMapper(EnumValueMapper.class); @Mapping(source = "code", target = "enumName", qualifiedByName = "getEnumDefinition") TargetDto map(SourceEntity source, @Context IEnumDefinitionDao enumDao); }无需在@Mapping中声明@Context
正如你看到的其他人的用法,@Mapping里只需指定source和qualifiedByName即可,MapStruct会自动识别映射方法中的@Context参数,并传递给转换方法中对应的@Context参数,不需要额外配置。
常见误区
如果转换方法没有给IEnumDefinitionDao加@Context,MapStruct会把它当成普通的source参数,此时就会出现“找不到仅含String参数的标注方法”的错误——因为它期望匹配一个只有String参数的方法,但你的方法有两个参数。
内容的提问来源于stack exchange,提问作者Kpo
相关产品推荐
相关产品推荐

