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

