在 mapstruct 中,当使用多参数映射方法时,需通过 `@mapping(source = "paramname")` 显式指定非实体参数作为源,而非依赖 `qualifiedbyname`;否则无法将字符串等额外参数映射至嵌套目标路径(如 `content.shorttext`)。
MapStruct 支持将多个方法参数(如实体 + 普通值)联合映射到一个目标对象。关键在于:只有实体类字段可被自动解析为源,而额外传入的原始类型参数(如 String shortText)必须显式声明为 source。
✅ 正确写法如下:
@Mapper
public interface EntityMapper {
@Mapping(target = "content.shortText", source = "shortText")
@Mapping(target = "content.longText", source = "longText")
EntityDto mapToDto(Entity entity, String shortText, String longText);
}调用时:
EntityDto dto = mapper.mapToDto(entity, "Hello", "WorldLong"); // → dto.getContent().getShortText() == "Hello" // → dto.getContent().getLongText() == "WorldLong"
⚠️ 常见误区说明:
径(如 content.shortText),MapStruct 会自动处理中间对象(content)的实例化——前提是 EntityDto 的 content 字段有默认构造器或已初始化(否则需配合 @BeanMapping(nullValuePropertyMappingStrategy = SET_TO_NULL) 或自定义构建逻辑)。? 补充建议:
@Mapping(target = "content.shortText",
expression = "java(shortText != null ? shortText.substring(0, Math.min(50, shortText.length())) : null)")掌握 source 参数绑定机制,是高效使用 MapStruct 多源映射的基础。务必以官方文档 Mappings with several source parameters 为准,避免混淆 source、qualifiedByName 和 constant 等语义。