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

如何在MapStruct中忽略列表内对象的指定属性映射

解决MapStruct忽略集合内对象属性的问题

这个问题我之前也碰到过,MapStruct对集合内嵌套属性的忽略配置确实不能直接用你那种点路径的方式,得换个思路——先单独定义集合元素的映射规则,再让顶层映射器复用这个规则就行。

方法一:单独定义子对象的映射器

首先创建一个GameMapper接口,专门处理GameEntity到GameDto的映射,在这里配置需要忽略的属性:

@Mapper
public interface GameMapper {
    @Mapping(target = "visitorTeam", ignore = true)
    @Mapping(target = "localTeam", ignore = true)
    @Mapping(target = "competition", ignore = true)
    GameDto entityToDto(GameEntity entity);
}

然后修改你的CompetitionMapper,通过uses属性引入这个GameMapper,这样MapStruct在处理games集合时,会自动调用GameMapper里的规则:

@Mapper(uses = GameMapper.class)
public interface CompetitionMapper {
    CompetitionDto entityToDto(CompetitionEntity entity);
}

方法二:在顶层映射器中定义子对象映射方法

如果不想单独创建子映射器,也可以在CompetitionMapper内部直接定义单个GameEntity到GameDto的映射方法,MapStruct会自动识别并应用到集合映射上:

@Mapper
public interface CompetitionMapper {
    CompetitionDto entityToDto(CompetitionEntity entity);

    // 定义单个Game对象的映射规则
    @Mapping(target = "visitorTeam", ignore = true)
    @Mapping(target = "localTeam", ignore = true)
    @Mapping(target = "competition", ignore = true)
    GameDto gameEntityToGameDto(GameEntity gameEntity);
}

为什么原来的配置不生效?

MapStruct中,@Mapping(target = "games.visitorTeam", ignore = true)这种点路径配置只适用于单个对象的嵌套属性,比如如果CompetitionEntity里直接有一个GameEntity属性而不是集合,这种写法是有效的。但对于集合来说,MapStruct会遍历集合中的每个元素,调用对应的单个元素映射方法,所以必须单独为集合元素定义映射规则才行。

内容的提问来源于stack exchange,提问作者sergio morlan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:42:33