如何在MapStruct中调用其他Mapper方法为Target字段赋值?
解决MapStruct跨Mapper字段映射问题
要让SourceToTargetMapper正确复用SourceToDataHolderMapper来处理Target中的holder字段,你可以按照以下两种方式实现:
方式一:使用@Named与qualifiedByName
- 先给
SourceToDataHolderMapper的映射方法添加@Named注解标记方法名:
import org.mapstruct.Named; import org.mapstruct.Mapper; @Mapper public interface SourceToDataHolderMapper { @Named("sourceToDataHolder") DataHolder sourceToDataHolder(Source src); }
- 修改
SourceToTargetMapper,在@Mapper注解中通过uses属性引入依赖的Mapper,再在@Mapping中指定来源为整个Source对象(用.表示),并通过qualifiedByName指定要调用的方法:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(uses = SourceToDataHolderMapper.class) public interface SourceToTargetMapper { @Mapping(target = "holder", source = ".", qualifiedByName = "sourceToDataHolder") Target sourceToTarget(Source src); }
方式二:使用expression直接调用方法
这种方式不需要额外添加@Named注解,直接在@Mapping的expression中调用SourceToDataHolderMapper的方法:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(uses = SourceToDataHolderMapper.class) public interface SourceToTargetMapper { @Mapping(target = "holder", expression = "java(sourceToDataHolder(src))") Target sourceToTarget(Source src); }
关键注意点
- 确保
SourceToDataHolderMapper的映射方法是公共可访问的; uses属性的作用是告诉MapStruct在生成实现类时,引入指定的Mapper作为依赖,从而复用其映射逻辑;- 用
source = "."表示将整个输入参数(即Source对象)传递给目标方法,匹配sourceToDataHolder方法的入参类型。
内容的提问来源于stack exchange,提问作者Юлия Руденко
相关产品推荐
相关产品推荐

