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;
        };
    }

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

任何帮助,将不胜感激。

提前致谢。

4

1 回答 1

1

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

如果在查询数据库时使用select而不是使用,则可以轻松解决问题。selectAllLagomCassandraSession提供了两种方法来查询数据库:(1)select(...)将立即返回 a Source<Row,NotUsed>,它是一个反应流或 (2)selectAll(...)将收集内存中的所有行并返回 a 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<>. 您可以Source<>使用您已经开发的 lambda 单独映射项目。

于 2017-04-27T14:36:43.073 回答