使用 Vert.x 的 JAXRS 服务

JAXRS Service using Vert.x


我在应用程序服务器中实现 JAX-RS 服务,使用 Vert.x 结合 Vert.x Pg 池存储数据。存储数据非常简单,因为 return 对客户端没有任何影响。然而,当涉及到 HTTP GET 请求时,它变得更加复杂。 例如:

public List<Data> findAll() {
    List<Data> list = new ArrayList<>();
    pool.query("SELECT * FROM DATA", ar -> {
        if (ar.succeeded()) {

            RowSet rows = ar.result();

            for (Row row : rows) {
                list.add(new Data(row.getString(0), row.getString(1)));

            }
        } else {
            System.out.println("Failure: " + ar.cause().getMessage());
        }
    });

  return list;
}

因此,如您所见,作为 "ar" 一个 io.vertx.core.AsyncResult 它立即 returns,带有一个空的 ArrayList。 我知道我应该 return 一个 AsyncResult 或其子类,只是我不知道当查询完成时客户端如何获取对象列表。 有什么想法/例子吗? 谢谢!

要使用 Reactive Pg Client 创建 JAX-RS 应用程序,我建议使用 Quarkus

您将获得由 Quarkus 提供的 PgPool,它使用 JDK CompletionStage 具有特殊的 API。然后在 Quarkus 中你的 JAX-RS 方法可能 return a CompletionStage.

您的方法如下所示:

public CompletionStage<List<Data>> findAll() {
    pool.query("SELECT * FROM DATA")
        .thenApply(rows -> {
            List<Data> list = new ArrayList<>();
            for (Row row : rows) {
                list.add(new Data(row.getString(0), row.getString(1)));
            }
            return list;
    });
}

免责声明:我在 Red Hat 工作,我是 Vert.x 核心团队成员和 Quarkus 贡献者。