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

Spring Boot修改带分页Page响应时遇类型转换异常

问题根源

你的Repository方法定义返回Page<List<TestDTO>>,但实际JPA执行查询后返回的是单个TestDTO对象的分页集合,而非List<TestDTO>的分页。这导致Spring Data将Page的泛型元素错误识别为TestDTO,但你声明的是List<TestDTO>。当调用Page.map()时,方法尝试将每个TestDTO对象强制转换为List<TestDTO>,从而抛出ClassCastException。

解决方案

1. 修正Repository方法返回类型

将返回类型从Page<List<TestDTO>>改为Page<TestDTO>,匹配查询实际返回的单个DTO分页结果:

@Query("SOME QUERY")
Page<TestDTO> findAllValues(@Param("itemNo") String itemNo, PageRequest pageRequest);

2. 修改服务层转换逻辑

直接对Page中的每个TestDTO进行属性修改,自动保留分页信息:

Page<TestDTO> resultsPage = repository.findAllValues("itemOne", 
    PageRequest.of(offset, pageSize, Sort.by(direction, field)));

// 对每个DTO执行属性修改
resultsPage = resultsPage.map(testDTO -> {
    testDTO.setItemName("New Name");
    return testDTO;
});

特殊场景:查询确实返回List分页

如果你的查询是分组逻辑,每个分页元素确实是List<TestDTO>,则手动创建新Page对象避免泛型转换问题:

Page<List<TestDTO>> resultsPage = repository.findAllValues("itemOne", 
    PageRequest.of(offset, pageSize, Sort.by(direction, field)));

// 处理每个List<TestDTO>
List<List<TestDTO>> transformedContent = resultsPage.getContent().stream()
    .map(this::transformTestDTOs)
    .collect(Collectors.toList());

// 基于原分页信息创建新Page对象
Page<List<TestDTO>> transformedPage = new PageImpl<>(
    transformedContent,
    resultsPage.getPageable(),
    resultsPage.getTotalElements()
);

// 原转换方法可复用
private List<TestDTO> transformTestDTOs(final List<TestDTO> testDTOList) {
    testDTOList.forEach(testDTO -> testDTO.setItemName("New Name"));
    return testDTOList;
}

核心说明

Spring Data的Page.map()是针对Page内单个元素做转换,必须保证Repository方法的返回泛型与实际查询结果完全匹配,否则会触发类型转换异常。

内容的提问来源于stack exchange,提问作者Ashok.N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:58:14