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

如何在CoroutineCrudRepository中实现分页?Spring Boot Kotlin报错求助

问题解答

报错原因

你遇到的IllegalStateException是因为Spring Data对分页方法的返回类型有严格要求:分页方法要么返回包含分页元数据的Page/Slice包装类型,要么使用多元素响应式包装(如Flux)。你当前定义的suspend fun findAllOrderByTitle(page: Pageable): Flow<Activity>不符合规则——Flow<Activity>仅流式返回数据,没有携带分页相关的元数据(总条数、总页数等),因此启动时触发校验异常。

如何在CoroutineCrudRepository中实现分页

完全可以在CoroutineCrudRepository中实现分页,只需调整方法的返回类型为Page<Activity>(或Slice<Activity>),同时保证方法名符合Spring Data命名规范:

@Repository
interface CoroutinesActivityRepository : CoroutineCrudRepository<Activity, String> {
    // 返回Page<Activity>,包含完整分页元数据(总条数、总页数等)
    suspend fun findAllByOrderByTitle(pageable: Pageable): Page<Activity>
    
    // 或返回Slice<Activity>,仅包含当前页数据和是否有下一页的标记(性能更优)
    // suspend fun findAllByOrderByTitle(pageable: Pageable): Slice<Activity>
}

两种返回类型区别

  • Page<Activity>:会额外查询总记录数,返回完整的分页信息,适合需要展示总页数、总条数的场景。
  • Slice<Activity>:仅查询当前页数据和下一页存在标记,不查询总记录数,适合不需要总页数的场景,性能更优。

关于你当前的ReactiveMongoTemplate实现

你用ReactiveMongoTemplate结合asFlow()的写法是可行的,但这种方式仅返回分页后的数据流,不会携带分页元数据。如果业务不需要分页元数据,这种写法可以继续使用;如果需要分页信息,建议改用上述CoroutineCrudRepository的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:46:08