首页 文章

使用Lagom框架获取列表

提问于
浏览
0

我对Lagom框架非常陌生,我完全不知道我在做什么 . 我有一个简单的CRUD lagom应用程序可以工作,但我无法弄清楚如何检索列表 .

所以这就是我现在所拥有的,但我得到了

@Override
    public ServiceCall<NotUsed, Source<Movie, ?>> getMovies() {
        return request -> {
            CompletionStage<Source<Movie, ?>> movieFuture = session.selectAll("SELECT * FROM movies")
                    .thenApply(rows -> rows.stream()
                    .map(row -> Movie.builder()
                        .id(row.getString("id"))
                        .name(row.getString("name"))
                        .genre(row.getString("genre"))
                        .build()));
                    //.thenApply(TreePVector::from));
                    //.thenApply(is -> is.collect(Collectors.toList()))

            return movieFuture;
        };
    }

但我在 rows.stream() 线上收到 [Java] Type mismatch: cannot convert from Stream<Object> to Source<Movie,?> 错误 .

任何帮助,将不胜感激 .

提前致谢 .

1 回答

  • 1

    看起来返回类型应该是 Source (来自Akka Reactive Streams),但是您正在构建Java 8 Stream .

    如果在查询数据库时使用 select 而不是 selectAll ,则可以轻松解决此问题 . Lagom的 CassandraSession 提供两个meqthods系列来查询DB:(1) select(...) 将立即返回 Source<Row,NotUsed> 这是一个反应流或(2) selectAll(...) 将收集内存中的所有行并返回 List<Row> . 后者可能会关闭您的服务器,因为它会尝试将所有信息都放在内存中 . 前者将使用反应流来提供物品,使速度适应您的消耗最终速度(背压),从而保持极低的内存占用 .

    您的代码可以重写为:

    public ServiceCall<NotUsed, Source<GreetingMessage, ?>> getGreetings() {
        return request ->
             CompletableFuture.completedFuture(
                  session.select("SELECT * FROM greetings")
                         .map(row -> new GreetingMessage(row.getString(0)))
              );
     }
    

    使用 select 创建 Source<> . 您可以使用已经开发的lambda在 Source<> 上单独映射项目 .

相关问题