Как я могу вернуть значения моей базы данных через Vertx?

#java #vert.x

#java #vert.x

Вопрос:

Добрый день, я пытаюсь получить значения из своей базы данных и добавить их в список, и я всегда получаю null. В чем причина и как она может сохранить эти значения? Когда дело доходит до печати с помощью консоли, у меня нет проблем. С наилучшими пожеланиями.

  public List<JsonObject> getAll() {
List<JsonObject> listObject = new ArrayList<JsonObject>();
try {
  this.connect();
  this.client.query("SELECT * FROM user")
    .execute().onSuccess(ar -> {
        for (Row row : ar) {
          listObject.add(row.toJson());
          System.out.println("---- OK "   listObject.stream().collect(Collectors.toList()));
        }
      }
    );
} catch (Exception e) {
  System.out.println(e.getLocalizedMessage());
}
System.out.println("--- Null: "   listObject.stream().collect(Collectors.toList()));
return listObject;
 

}

Ответ №1:

Вы бы не стали использовать return , так как это асинхронный вызов.

Вместо этого передайте Consumer

 public void getAll(Consumer<ArrayList<JsonObject>> callback) {

    try {
      this.connect();
      this.client.query("SELECT * FROM user").execute().onSuccess(ar -> {
        List<JsonObject> listObject = new ArrayList<>();
        for (Row row : ar) {
          listObject.add(row.toJson());
        }
        System.out.printf("Fetched %d objects%n", listObject.size());
        callback.accept(listObject);  // this replaces your return statement
      });
    } catch (Exception e) {
      System.out.println(e.getLocalizedMessage());  // TODO: replace with a proper logger
    }
}
 

В другом месте передайте экземпляр потребителя

 databaseClient.getAll(list -> {
  // TODO: use the list to perform some action 
})
 

В противном случае вы можете захотеть взглянуть на R2DBC и как его можно использовать для подключения подписчиков к набору результатов.

Комментарии:

1. Спасибо. Извините за вопрос, но если бы я хотел, чтобы он возвращал значение, как бы я должен был это сделать? Если это возможно в любом случае. Приветствую.

2. Невозможно вызвать return или изменить внешнюю не окончательную переменную, которую вы могли бы вернуть внутри onSuccess , нет. По умолчанию Vertx должен оставаться неблокирующим (какие операторы возврата обычно существуют для методов блокировки)