MapStruct如何将外部属性映射到List内元素对象的对应属性
问题描述
定义的模型类如下:
public class BookWriteModel { List<PageWriteModel> pages; } public class Book { List<Page> pages; } public class PageWriteModel { Long pageNumber; } public class Page { Long pageNumber; Long userId; } public class User { Long userId; }
现有MapStruct Mapper代码:
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE ) public interface BookMapper { Book map(BookWriteModel bookWriteModel, User user); }
需要实现:将传入User对象的userId属性,映射到目标Book的pages集合中每个Page对象的userId属性,求最简实现方式。
最简实现
直接通过@Context注解透传上下文参数即可,不需要手写任何映射逻辑实现,修改后的Mapper代码如下:
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE ) public interface BookMapper { Book map(BookWriteModel bookWriteModel, @Context User user); @Mapping(target = "userId", source = "user.userId") Page mapPage(PageWriteModel pageWriteModel, @Context User user); }
实现说明
- 给
User参数加上@Context注解后,MapStruct会把这个参数作为上下文透传给内部调用的所有映射方法,不会尝试把User的属性直接映射到顶层Book对象的字段上。 - 新增的单页映射方法会被MapStruct自动识别,在处理
pages集合映射时,会遍历源集合的每个元素调用这个方法,同时透传上下文里的User对象,自动给每个生成的Page实例的userId字段赋值。 - 这种方式不需要写默认方法、不需要写
@AfterMapping后置循环逻辑,所有赋值代码都由MapStruct在编译期自动生成,类型安全,没有额外运行时开销。
内容的提问来源于stack exchange,提问作者kylie.zoltan
相关产品推荐
相关产品推荐

