我对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 回答
看起来返回类型应该是
Source
(来自Akka Reactive Streams),但是您正在构建Java 8Stream
.如果在查询数据库时使用
select
而不是selectAll
,则可以轻松解决此问题 . Lagom的CassandraSession
提供两个meqthods系列来查询DB:(1)select(...)
将立即返回Source<Row,NotUsed>
这是一个反应流或(2)selectAll(...)
将收集内存中的所有行并返回List<Row>
. 后者可能会关闭您的服务器,因为它会尝试将所有信息都放在内存中 . 前者将使用反应流来提供物品,使速度适应您的消耗最终速度(背压),从而保持极低的内存占用 .您的代码可以重写为:
使用
select
创建Source<>
. 您可以使用已经开发的lambda在Source<>
上单独映射项目 .