Я пытаюсь объединить CompletionStages в игровой среде, а затем вернуть результат, как ok ().Это мои настройки:
AccountDao, который имеет два метода:
public CompletionStage<Account> getUserByEmail(String email) {
return supplyAsync(() -> ebeanServer.find(Account.class).setUseCache(true).where().eq(EMAIL, email).findOne(), executionContext).thenApply(account -> {
return account;
});
}
public CompletionStage<Void> updateAccount(Account account) throws OptimisticLockException{
return runAsync(() -> {
ebeanServer.update(account);
}, executionContext);
}
И затем у меня есть мой контроллер с действием:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
return CompletableFuture.completedFuture(ok());
}
Так что теперь в действиисначала я хочу выполнить getUserByEmail, а затем установить некоторые значения и обновить их методом updateAccount.Как я могу объединить эти два этапа, не блокируя игровой контекст?Я пробовал разные настройки с thenCompose и комбинировать, но я не понимаю ...
Вот одна из моих попыток:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
accountDao.getUserByEmail(session().get("accountEmail")).thenCompose(x -> accountDao.updateAccount(x).thenApplyAsync(account -> {
return ok("Going to save account edits");
}, httpExecutionContext.current()));
return CompletableFuture.completedFuture(ok("Fehler am Ende"));
}
Проблема в том, что я не могу получить доступ к учетной записи (x), потому что я не могу установить это как функцию ... вот так:
public CompletionStage<Result> editAccount() {
Map<String, String[]> form_values = request().body().asFormUrlEncoded();
accountDao.getUserByEmail(session().get("accountEmail")).thenCompose(x -> {
//Update vars in x and then save to database
accountDao.updateAccount(x);
}.thenApplyAsync(account -> {
return ok("Going to save account edits");
}, httpExecutionContext.current()));
return CompletableFuture.completedFuture(ok("Fehler am Ende"));
}
Здесь я получаю сообщение об ошибке: целевой тип этого выражения должен быть функциональным интерфейсом, и plays говорит, что я должен включитьоператор return в конце функции!
Я просто не понимаю ... Спасибо за вашу помощь!
@ Marimuthu Madasamy Это точно не то, что я хочу.В вашем awnser я бы обновил аккаунт дважды.На etime в accountDao.updateAccount (account) и в accountDao.saveAccount (account);Я хочу что-то вроде этого:
return accountDao.getUserByEmail("mail").thenCompose(account -> {
account.setName("NewName");
accountDao.save(account);
} .thenApplyAsync(voidInput -> {
return ok("Account saved");
}, httpExecutionContext.current()));
В этом случае только один раз обновите учетную запись и верните результат только по httpExecutionContext