Служба JAXRS с использованием Vert.x


Я реализую службу 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 или его подкласс, просто я понятия не имею, как клиент может получить список объектов после завершения запроса. Любая идея / пример? Спасибо!


person Carla    schedule 01.10.2019    source источник


Ответы (1)


Для создания приложений 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.

person tsegismont    schedule 01.10.2019
comment
Большое спасибо за ваш ответ. В настоящий момент я развертываю этот пример на WildFly, просто интересно, почему приведенный выше код компилируется на Quarkus, а не на WildFly. Я получаю ошибку: не удается разрешить запрос метода (String), поскольку ожидается использование (String, Handler) для метода запроса. Знаете ли вы, можно ли реорганизовать приведенный выше код для использования также и обработчика? Спасибо! - person Carla; 01.10.2019
comment
Приведенный выше код компилируется на Quarkus, поскольку он использует Smallrye Vert клиенты .x. В Wildfly, я думаю, вы добавили необработанный JAR-файл Vert.x Reactive Pg Client JAR в свои библиотеки WAR. - person tsegismont; 01.10.2019
comment
Я бы рекомендовал не использовать API на основе обратного вызова при создании приложений JAX-RS. Две модели программирования просто не совпадают. - person tsegismont; 01.10.2019