Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CompletionStage与Java中的play框架操作相结合_Java_Database_Playback_Completable Future_Completion Stage - Fatal编程技术网

将CompletionStage与Java中的play框架操作相结合

将CompletionStage与Java中的play框架操作相结合,java,database,playback,completable-future,completion-stage,Java,Database,Playback,Completable Future,Completion Stage,我尝试在play框架中组合CompletionStages,然后返回类似ok()的结果。这是我的设置: AccountDao有两种方法: public CompletionStage<Account> getUserByEmail(String email) { return supplyAsync(() -> ebeanServer.find(Account.class).setUseCache(true).where().eq(EMAIL, email).findO

我尝试在play框架中组合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);
}

在这种情况下,只更新帐户一次,并且只返回httpExecutionContext上的结果

如果我正确理解了您的问题,您希望在
updateAccount(account)
方法调用之后访问(保存?)帐户

由于
updateAccount
方法返回
CompletionStage
,因此在此stage上调用
theapplyasync
时,输入类型将仅为
Void
,而不是
Account
。但是使用以下代码,您仍然可以访问从
getUserByEmail
返回的帐户,假设
updateAccount
通过文本“updatevars in x”对帐户进行变异:

公共CompletionStage编辑帐户(){ 返回帐户DAO .getUserByEmail(电子邮件) .Thencose(account->accountDao.updateAccount(account) .ThenApplySync(无效输入->{ //在这里,您仍然可以通过“getUserByEmail”方法访问“account” accountDao.saveAccount(account); 返回ok(“已保存账户”); },httpExecutionContext.current()); }
好的,在Marimuthu Madasamy的支持下,我在这里找到了自己的awnser!谢谢。我试着解释一下。首先是代码:

public CompletionStage<Result> editAccount() {
    Map<String, String[]> form_values = request().body().asFormUrlEncoded();
    return accountDao.getUserByEmail(session().get("accountEmail")).thenApply(account -> {
        System.out.println("Async get Account / "+Thread.currentThread());
        account.setCompany(form_values.get("company")[0]);
        return accountDao.updateAccount(account);
    }).thenApplyAsync(account -> {
        System.out.println("Async resutl / "+Thread.currentThread());
        return ok("Account saved normal");
    }, httpExecutionContext.current()).exceptionally(e ->{
        System.out.println("Async exception / "+Thread.currentThread());
        System.out.println(e.getLocalizedMessage());
        return ok(e.getLocalizedMessage());
    });
}
公共CompletionStage编辑帐户(){ 映射表单_值=请求().body().asFormUrlEncoded(); 返回accountDao.getUserByEmail(session().get(“accountEmail”))。然后应用(account->{ System.out.println(“异步获取帐户/”+Thread.currentThread()); account.setCompany(form_values.get(“company”)[0]); 返回accountDao.updateAccount(account); }).然后应用同步(帐户->{ System.out.println(“异步resutl/”+Thread.currentThread()); 返回ok(“正常保存的帐户”); },httpExecutionContext.current())。异常情况下(e->{ System.out.println(“异步异常/”+Thread.currentThread()); System.out.println(e.getLocalizedMessage()); 返回ok(例如getLocalizedMessage()); }); }
好的,首先我执行accountDao.getUserByEmail()正如您在我的awnser的顶部所看到的,这将返回CompletionStage,并在我的数据库执行上下文中执行。在接下来的应用程序中,我得到结果并执行下一个异步方法。我使用应用程序同步的应用实例,因此下一个调用也将在数据库执行上下文中执行,而不显式设置它untDao.updateAccount()我在httpExecutionContext上执行下一个阶段,以重播结果或异常退出!我真的希望这是清楚的,并对某些人有所帮助!

我编辑了我的问题。也许你知道如何实现这一点?我在CompletionStage控制器中不使用httpExecutionContext。但它仍然有效。你能解释一下为什么吗?
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"));
}
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"));
}
return accountDao.getUserByEmail("mail").thenCompose(account -> {
       account.setName("NewName");
       accountDao.save(account);
    } .thenApplyAsync(voidInput -> {
        return ok("Account saved");
    }, httpExecutionContext.current()));
public CompletionStage<Result> editAccount() {
    return accountDao
            .getUserByEmail(email)
            .thenCompose(account -> accountDao.updateAccount(account)
                    .thenApplyAsync(voidInput -> {
                        // here you still have access to the `account` from `getUserByEmail` method
                        accountDao.saveAccount(account);
                        return ok("Account saved");
                    }, httpExecutionContext.current());
}
public CompletionStage<Result> editAccount() {
    Map<String, String[]> form_values = request().body().asFormUrlEncoded();
    return accountDao.getUserByEmail(session().get("accountEmail")).thenApply(account -> {
        System.out.println("Async get Account / "+Thread.currentThread());
        account.setCompany(form_values.get("company")[0]);
        return accountDao.updateAccount(account);
    }).thenApplyAsync(account -> {
        System.out.println("Async resutl / "+Thread.currentThread());
        return ok("Account saved normal");
    }, httpExecutionContext.current()).exceptionally(e ->{
        System.out.println("Async exception / "+Thread.currentThread());
        System.out.println(e.getLocalizedMessage());
        return ok(e.getLocalizedMessage());
    });
}