如何在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
相关产品推荐
相关产品推荐

