MapStruct Java问题:无法从可迭代类型生成到非可迭代类型的映射方法
问题:MapStruct映射时出现可迭代类型到非可迭代类型的错误
我是Java编程新手,正在尝试进行DTO映射以实现数据过滤。相关代码如下:
Request类
@Data @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class Request { List<EventType> eventType; String eventRef; List<Status> status; LocalDate DateFrom; LocalDate DateTo; }
FilterDto类
public class FilterDto { @JsonProperty("eventType") @Valid private List<EventTypeEnum> eventType = null; @JsonProperty("eventRef") private String eventRef; @JsonProperty("status") @Valid private List<StatusEnum> status = null; @JsonProperty("DateFrom") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private LocalDate DateFrom; @JsonProperty("DateTo") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private LocalDate DateTo; }
MapStruct映射方法
Request map(List<FilterDto> filter);
控制器调用代码
Request request = registryMapper.map(regPageReqDto.getFilter());
其中regPageReqDto是Swagger生成的包含FilterDto的类,目前遇到无法从可迭代类型生成到非可迭代类型的映射方法的问题。
解决方案
错误原因
映射方法声明接收List<FilterDto>,但实际调用时传入的是单个FilterDto对象(regPageReqDto.getFilter()返回的是单个FilterDto而非集合),MapStruct无法直接将集合类型映射为单个对象类型,因此报错。
修复步骤
- 修正映射方法参数类型,将参数从
List<FilterDto>改为单个FilterDto:
Request map(FilterDto filter);
- 处理枚举类型映射:如果
EventType与EventTypeEnum、Status与StatusEnum是不同类型,需在映射接口中添加枚举转换逻辑(若枚举值名称一致,MapStruct可自动处理;不一致则手动实现转换):
@Mapper public interface RegistryMapper { RegistryMapper INSTANCE = Mappers.getMapper(RegistryMapper.class); // 基础对象映射 Request map(FilterDto filter); // 枚举转换示例(若枚举结构不一致时使用) default EventType mapEventType(EventTypeEnum enumValue) { return EventType.valueOf(enumValue.name()); } default Status mapStatus(StatusEnum enumValue) { return Status.valueOf(enumValue.name()); } }
- 验证调用逻辑:确认
regPageReqDto.getFilter()返回的是单个FilterDto对象。如果实际返回的是集合,需调整映射方法为返回List<Request>,或根据业务逻辑取集合中第一个元素进行映射。
内容的提问来源于stack exchange,提问作者Marzepanio Tortus
相关产品推荐
相关产品推荐

