使用 Lagom 框架获取列表
Fetching a list with Lagom framework
我对 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,?>
错误。
如有任何帮助,我们将不胜感激。
提前致谢。
看起来 return 类型应该是 Source
(来自 Akka Reactive Streams),但您正在构建 Java 8 Stream
.
如果您在查询数据库时使用select
而不是selectAll
,问题就很容易解决。 Lagom 的 CassandraSession
提供了两个系列的方法来查询数据库:(1) select(...)
将立即 return 一个 Source<Row,NotUsed>
这是一个反应流或 (2) selectAll(...)
这将收集内存中的所有行和 return 一个 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<>
上单独映射项目。
我对 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,?>
错误。
如有任何帮助,我们将不胜感激。
提前致谢。
看起来 return 类型应该是 Source
(来自 Akka Reactive Streams),但您正在构建 Java 8 Stream
.
如果您在查询数据库时使用select
而不是selectAll
,问题就很容易解决。 Lagom 的 CassandraSession
提供了两个系列的方法来查询数据库:(1) select(...)
将立即 return 一个 Source<Row,NotUsed>
这是一个反应流或 (2) selectAll(...)
这将收集内存中的所有行和 return 一个 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<>
上单独映射项目。