【问题标题】:JAXRS Service using Vert.x使用 Vert.x 的 JAXRS 服务
【发布时间】:2019-10-01 09:00:24
【问题描述】:


我正在使用 Vert.x 与 Vert.x Pg 池结合存储数据的应用程序服务器中实现 JAX-RS 服务。存储数据非常简单,因为没有什么可以返回给客户端。然而,当涉及到 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;
}

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

【问题讨论】:

    标签: vert.x pgpool


    【解决方案1】:

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

    您将获得 Quarkus 提供的 PgPool,它具有使用 JDK CompletionStage 的特殊 API。然后在 Quarkus 中,您的 JAX-RS 方法可能会返回 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 贡献者。

    【讨论】:

    • 非常感谢您的回答。目前,我正在将示例部署在 WildFly 上,只是想知道为什么上面的代码在 Quarkus 而不是 WildFly 上编译。我得到的错误是“无法解析方法查询(字符串)”,因为它应该使用(字符串,处理程序)作为查询方法。你知道上面的代码是否可以重构为也使用 Handler 吗?谢谢!
    • 上面的代码在 Quarkus 上编译,因为它使用了Smallrye Vert.x clients。在 Wildfly 上,我猜您将原始 Vert.x Reactive Pg Client JAR 添加到您的 WAR 库中。
    • 我建议在构建 JAX-RS 应用程序时不要使用基于回调的 API。这两种编程模型根本不匹配。
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 2018-06-26
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多