Что такое альтернатива switchIfEmpty в Smallrye Mutiny
В RxJava 2 и Reactor есть switchIfEmpty
like метод переключения на новый поток, если в текущем потоке нет элементов.
Но когда я начал использовать 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());
}
Как вернуть Uni
означает 0 или 1 элемент в PostRepository
, и используйте switchIfEmpty
как метод в PostResource
построить альтернативный путь для потока?
1 ответ
Uni
не может быть пустым в том смысле, что всегда содержит элемент (потенциальноnull
).
Итак, эквивалент switchIfEmpty
является uni.onItem().ifNull().switchTo(() -> ...)