MapStruct多源集合映射异常:单源正常多源生成空列表
MapStruct多源集合映射返回空列表的解决方法
问题核心在于MapStruct无法自动推断多源集合映射应该关联哪个单对象映射方法,导致生成的实现仅创建空列表而不填充数据。以下两种方案可以解决这个问题:
方案一:使用@Named和@IterableMapping指定映射逻辑
通过注解明确告诉MapStruct,多源集合映射需要调用带第二个源参数的单对象映射方法:
import org.mapstruct.Named; import org.mapstruct.IterableMapping; import org.mapstruct.Mapper; @Mapper public interface MyMapper { MyVO mapEntityToVO(MyEntity entity); // 正常工作 ArrayList<MyVO> mapEntityListToVOList(List<MyEntity> entities); // 正常工作 @Named("withSecondSource") MyVO mapEntityToVO(MyEntity entity, MySecondSource source); // 正常工作 @IterableMapping(qualifiedByName = "withSecondSource") ArrayList<MyVO> mapEntityListToVOList(List<MyEntity> entities, MySecondSource source); }
添加注解后,MapStruct会生成循环调用@Named("withSecondSource")标记的单对象方法的实现,正确填充列表数据。
方案二:手动实现默认方法(Java 8+)
直接在Mapper接口中编写默认方法,手动循环调用双源单对象映射逻辑,绕过MapStruct的自动生成限制:
import org.mapstruct.Mapper; import java.util.ArrayList; import java.util.List; @Mapper public interface MyMapper { MyVO mapEntityToVO(MyEntity entity); // 正常工作 ArrayList<MyVO> mapEntityListToVOList(List<MyEntity> entities); // 正常工作 MyVO mapEntityToVO(MyEntity entity, MySecondSource source); // 正常工作 default ArrayList<MyVO> mapEntityListToVOList(List<MyEntity> entities, MySecondSource source) { if (entities == null) { return null; } ArrayList<MyVO> resultList = new ArrayList<>(entities.size()); for (MyEntity entity : entities) { resultList.add(mapEntityToVO(entity, source)); } return resultList; } }
这种方式无需依赖MapStruct的自动集合映射逻辑,直接通过自定义循环实现数据填充,逻辑清晰且可控。
内容的提问来源于stack exchange,提问作者s1moner3d
相关产品推荐
相关产品推荐

