首页 > 解决方案 > Java反应式编程中的分页

问题描述

我还是 Java 反应式编程的新手,我的项目要求希望我用 Java 中的反应式编程实现分页。

就像我打了一个 API,它在流中返回了 10000 条记录,那么我需要返回一个带有适当分页的通量。

任何人都可以建议我一个好的方法吗?

就像这就是我正在遵循的方法。

存储库

  public interface CouchBaseRepository extends ReactiveCouchBaseRepository<Book,Integer> {
   @Query("#{#n1ql.selectEntity} where name=$1")
   public Flux<Book> getPaginatedFlux(String name ,final Pageable pageable);

这是我的存储库,但是当我启动我的应用程序时,它会显示以下错误。

    java.lang.IllegalStateException: Method has to have one of the following return types! [interface org.springframework.data.domain.Page, interface org.springframework.data.domain.Slice, interface java.util.List]

我不能在这里使用页面接口,因为它被阻塞了,所以有什么办法可以解决这个问题吗?

标签: javareactive-programmingproject-reactor

解决方案


我还没有使用过 spring-webflux,所以我不能对特定的 API 调用发表评论,但我会提供一个“理论上的”答案,这可能也会有所帮助。

Flux 表示数据流(可能是无限的)。所以,分页有点不符合反应性,只是因为他们在谈论不同的事情

考虑在根据您的要求返回(逻辑决定的)多达 10000 条记录的通量的方法中使用输入参数(如通常的限制/偏移量)实现分页。

因此,一个调用将以“反应性方式”处理,但它只会返回一页数据,如果您想加载另一页 - 再做一次反应性调用。

当然在流的层面上,在接收到 10000 个对象之后,应该关闭流。这是我建议的方法。

还有另一种选择:通过一个流实现所有内容,但在这种情况下,客户端(UI 或使用分页数据的任何东西)必须“足够聪明”才能仅加载/卸载所需的数据。换句话说,如果你有 100 万个对象要显示,请考虑是否应该避免一次将所有 100 万个对象都加载到客户端的情况。

此外,页面导航会有点棘手(例如,获取下一页/上一页)。我以前没有这样工作过。我认为最重要的是,选择将是需求驱动的。


推荐阅读