Сервис JAXRS с использованием Vert.x - PullRequest
0 голосов
/ 01 октября 2019

Я внедряю службу JAX-RS на сервере приложений, используя Vert.x для хранения данных в сочетании с пулом Vert.x Pg. Хранить данные довольно просто, так как клиенту нечего возвращать. Однако, когда дело доходит до 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, он возвращается немедленно, с пустым ArrayList. Я понимаю, что должен вернуть AsyncResult или его подкласс, просто у меня нет идеи, как клиент мог получить список объектов, когда запрос завершен. Любая идея / пример? Спасибо!

1 Ответ

3 голосов
/ 01 октября 2019

Для создания приложений JAX-RS с Reactive Pg Client я бы рекомендовал использовать Quarkus .

. Вы получите PgPool, предоставленный Quarkus, со специальным API, использующимJDK CompletionStage. Тогда в 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.

...