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

