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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:12:24