我试图同时使用Munity API和Vertx Route。完整的代码是here。
我定义了这样的路由器规则。
CodeCommit Notification
处理程序实现是这样的。
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
运行应用程序时,并使用不存在的帖子ID在 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方法),它将按预期打印404错误状态,但是会有一些暂停时间。
在另一个处理程序方法中,它像以下一样调用/posts/postid
,并且运行良好,并且在未找到时快速响应。
findById