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

如何让MapStruct转换Spring Page时返回空列表而非null?

解决MapStruct转换Spring Page时空content返回null列表的问题

当然可以实现,以下是两种直接有效的方案:

方案一:自定义映射方法绕过hasContent()校验

在你的MapStruct映射器接口中,手动定义一个处理Page内容的方法,跳过MapStruct默认的hasContent()判断逻辑,直接获取并转换content:

@Mapper(componentModel = "spring")
public interface PageMapper {

    @Mapping(target = "journeys", source = "page", qualifiedByName = "convertPageContent")
    CustomPageDto toCustomDto(Page<Journey> page);

    // 自定义转换方法,强制返回空列表而非null
    @Named("convertPageContent")
    default List<JourneyDto> convertPageContent(Page<Journey> page) {
        if (page == null) {
            return Collections.emptyList();
        }
        // 直接调用getContent(),Spring Page无内容时会返回空列表
        return page.getContent().stream()
                .map(this::toJourneyDto)
                .collect(Collectors.toList());
    }

    // 单个实体的转换方法
    JourneyDto toJourneyDto(Journey journey);
}

这种方式完全由你控制内容的获取逻辑,避免MapStruct自动生成的hasContent()判断,确保无内容时返回空列表。

方案二:全局配置空值映射策略

如果希望整个映射器都遵循“空集合返回默认空列表”的规则,可以在@Mapper注解中配置nullValuePropertyMappingStrategy:

@Mapper(
    componentModel = "spring",
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT
)
public interface PageMapper {

    @Mapping(target = "journeys", source = "content")
    CustomPageDto toCustomDto(Page<Journey> page);

    JourneyDto toJourneyDto(Journey journey);
}

SET_TO_DEFAULT会让MapStruct在属性未被赋值(保持null)时,自动为集合类型设置空列表、为基本类型设置默认值,刚好覆盖你遇到的场景——即使MapStruct因hasContent()判断不赋值journeys,也会自动把它设为空列表。

补充说明

Spring Data的Page本身在无内容时,getContent()返回的就是空列表,而非null。MapStruct自动生成的hasContent()判断是出于性能优化,但不符合你的需求,上述两种方案都能有效绕过或修正这个逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:15:42