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
相关产品推荐
相关产品推荐

