#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 должен оставаться неблокирующим (какие операторы возврата обычно существуют для методов блокировки)