2

在 RxJava 2 和 Reactor 中,switchIfEmpty如果当前流中没有元素,则有类似的方法可以切换到新流。

但是当我开始使用Minuty时,当我将 Quarkus 样本转换为使用 Reactive 功能时,我找不到替代方案。

目前我的解决方案是:在我的 中PostRepository,我使用异常表示没有找到帖子。

 public Uni<Post> findById(UUID id) {
        return this.client
                .preparedQuery("SELECT * FROM posts WHERE id=$1", Tuple.of(id))
                .map(RowSet::iterator)
                .flatMap(it -> it.hasNext() ? Uni.createFrom().item(rowToPost(it.next())) : Uni.createFrom().failure(()-> new PostNotFoundException()));
    }

并将其捕获在PostResource.

@Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Uni<Response> getPostById(@PathParam("id") final String id) {
        return this.posts.findById(UUID.fromString(id))
                .map(data -> ok(data).build())
                .onFailure(PostNotFoundException.class).recoverWithItem(status(Status.NOT_FOUND).build());
    }

如何在 中返回Uni0 或 1 个元素PostRepository,并使用switchIfEmpty类似PostResource的方法为流构建替代路径?

4

1 回答 1

1

Uni不能为,因为它总是包含一个项目(可能null)。

所以,等价switchIfEmptyuni.onItem().ifNull().switchTo(() -> ...)

于 2020-04-23T13:29:19.727 回答