Проблема с обработчиком сбоев при использовании веб-маршрутов Vertx и Minity в приложении Quarkus
Я пробовал использовать Munity API и Vertx Route вместе. Полные коды здесь.
Я определил такое правило маршрутизатора.
router.put("/posts/:id").consumes("application/json").handler(BodyHandler.create()).handler(handlers::update);
И реализация обработчика такая.
LOGGER.log(Level.INFO, "\npath param id: {0}\nrequest body: {1}", new Object[]{id, body});
var form = fromJson(body, PostForm.class);
this.posts.findById(UUID.fromString(id))
.onFailure(PostNotFoundException.class).invoke(ex -> rc.response().setStatusCode(404).end())
.map(
post -> {
post.setTitle(form.getTitle());
post.setContent(form.getContent());
return this.posts.update(UUID.fromString(id), post);
}
)
.subscribe()
.with(data -> rc.response().setStatusCode(204).end());
в findById
метод, он бросает PostNotFoundException
.
public Uni<Post> findById(UUID id) {
return this.client
.preparedQuery("SELECT * FROM posts WHERE id=$1")
.execute(Tuple.of(id))
.map(RowSet::iterator)
// .map(it -> it.hasNext() ? rowToPost(it.next()) : null);
.flatMap(it -> it.hasNext() ? Uni.createFrom().item(rowToPost(it.next())) : Uni.createFrom().failure(PostNotFoundException::new));
}
При запуске приложения и обновления (через метод HTTP PUT) на /posts/postid
без существующего идентификатора сообщения он будет печатать статус ошибки 404, как и ожидалось, но в периоде есть время паузы.
В другом методе обработчика он вызывает findById
нравится следующее, и он хорошо работает и быстро реагирует, когда его не обнаруживают.
this.posts.findById(UUID.fromString(id))
.subscribe()
.with(
post -> rc.response().end(toJson(post)),
throwable -> rc.fail(404, throwable)
);