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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:11:38