如何在Mapper中忽略列表内子对象的指定属性以解决循环转换报错
你提到的@Mapping(target = "designatedCompanies[].partecipation", ignore = true)这种通配符配置集合元素属性的写法,MapStruct目前版本暂不直接支持,但可以通过以下几种方案解决循环依赖问题:
方案1:显式定义子对象转换规则并忽略循环字段
这是最常用的解决方案,你只需在Mapper中单独声明子对象的转换方法,加上忽略循环字段的配置,再给主转换方法指定使用该规则即可:
public interface PartecipationMapper extends EntityMapper<PartecipationDTO, Partecipation> { @Mapping(target = "designatedCompanies", qualifiedByName = "ignorePartecipationRef") PartecipationDTO toDto(Partecipation partecipation); // 定义转换DesignatedCompany时忽略关联的partecipation字段 @Named("ignorePartecipationRef") @Mapping(target = "partecipation", ignore = true) DesignatedCompanyDTO designatedCompanyToDto(DesignatedCompany designatedCompany); }
生成实现类时,MapStruct会自动调用上述带忽略规则的子对象转换方法处理集合中的所有元素,不会再递归转换partecipation属性,直接解决循环报错。
方案2:拆分不同场景的转换方法
如果部分业务场景需要保留DesignatedCompanyDTO的partecipation属性,你可以定义两个不同的转换方法,用@Named区分场景:
public interface PartecipationMapper extends EntityMapper<PartecipationDTO, Partecipation> { // 转换Partecipation时忽略子对象的关联引用 @Mapping(target = "designatedCompanies", qualifiedByName = "ignorePartecipationRef") PartecipationDTO toDtoWithoutCycle(Partecipation partecipation); // 常规转换DesignatedCompany,保留关联字段 DesignatedCompanyDTO toDto(DesignatedCompany designatedCompany); // 转换DesignatedCompany时忽略关联字段 @Named("ignorePartecipationRef") @Mapping(target = "partecipation", ignore = true) DesignatedCompanyDTO toDtoIgnorePartecipation(DesignatedCompany designatedCompany); }
说明
目前MapStruct(截止1.6.x版本)尚未支持集合元素属性的通配符路径配置,因此无法直接通过designatedCompanies[].partecipation这种写法批量忽略集合内所有元素的指定属性,上述两种方案是官方推荐的循环依赖处理方式。
内容的提问来源于stack exchange,提问作者StepoBiz
相关产品推荐
相关产品推荐

