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

MapStruct对象转换报错:List返回类型为抽象类或接口如何解决

MapStruct映射List属性编译报错解决方案

报错原文

error: The return type List is an abstract class or interface. Provide a non abstract / non interface result type or a factory method.

问题原因

报错由两个映射规则缺失直接触发:

  • List是接口类型,MapStruct无法直接实例化接口给DataDomainClass的data属性赋值,你也没有指定对应的List实现类或工厂生成方法
  • 你仅定义了EntityClass到DataDomainClass的映射方法,没有补充EntityClass到同字段DomainClass的转换逻辑,MapStruct无法推导如何将单个入参EntityClass转换为List<DomainClass>类型的属性值,编译阶段直接抛出错误。

修复方法

  • 在Mapper接口中补充单对象转换方法,MapStruct会自动完成两个同字段类的属性映射,不需要额外配置:
// 补充Entity转Domain的基础映射方法
DomainClass convertToDomain(EntityClass entity);
  • 给顶层映射方法添加显式映射规则,明确data字段的赋值逻辑:将入参Entity转换为DomainClass实例后,包装为单元素List赋值给目标字段
@Mapper
public interface BizMapper {
    BizMapper INSTANCE = Mappers.getMapper(BizMapper.class);

    DomainClass convertToDomain(EntityClass entity);

    // 显式指定data字段的生成规则
    @Mapping(target = "data", expression = "java(java.util.Collections.singletonList(convertToDomain(entity)))")
    DataDomainClass map(EntityClass entity);
}
  • 可选替代方案:如果不想用表达式赋值,可以在DataDomainClass定义时给data属性指定具体实现类的默认初始值,解决接口无法实例化的问题,但这种方式仍需要补充List内元素的映射规则,灵活度更低:
public class DataDomainClass{
    // 给List属性指定ArrayList作为默认实现
    private List<DomainClass> data = new java.util.ArrayList<>();
}

内容的提问来源于stack exchange,提问作者devnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:51:22