如何无需自定义映射器和@AfterMapping为列表对象映射指定值
解决方案
可以实现,无需自定义映射器或@AfterMapping注解。问题出在你直接对List集合做映射时,MapStruct无法自动将方法参数的id传递给每个Target对象。正确的做法是先定义单个对象的映射方法,再让MapStruct自动生成集合映射逻辑:
- 定义Mapper接口,添加单个对象的映射方法,明确指定
id参数到Target.id的映射:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import java.time.LocalDate; import java.util.List; @Mapper public interface SourceTargetMapper { // 单个对象映射:将方法参数id赋值给Target.id,其余字段自动映射 @Mapping(target = "id", source = "id") Target mapSourceToTarget(Long id, Source source); // MapStruct会自动基于上面的单个方法生成集合映射逻辑 List<Target> mapSourcesToTargets(Long id, List<Source> sources); }
- 调用
mapSourcesToTargets方法时,MapStruct会遍历输入的Source列表,对每个元素调用mapSourceToTarget方法,传入同一个id参数,完成每个Target对象的id赋值和其他字段的自动映射。
你之前直接写集合映射方法并添加@Mapping注解无效,是因为集合映射的注解无法直接作用于集合内的每个元素,必须通过单个对象的映射方法来传递参数。
内容的提问来源于stack exchange,提问作者Stephanus Nico
相关产品推荐
相关产品推荐

