Play Framework 2.4.x 在回调函数中执行保存操作

Play Framework 2.4.x execute a save operation in a callback function

我是一个使用 play 框架的新手,我需要一些帮助,因为我找不到代码没有更新存储在数据库中的地址的原因。

我可以看到指示成功的日志,但我没有看到反映的数据更改;我不确定是代码有问题还是我需要传递上下文。

此示例代码应存储在数据库中,然后我们与第三方通信成功异步更新一些字段。

提前致谢

public Result addUserAddress(final String userId) throws Exception {
    Address newAddress = AddressFrom.get();
    Address ua = new Address(user, 
    ThirdPartyApplication.findThirdPartyApplicationById(1));
    ua.save();

    Promise<Optional<Person>> promise = 
        restClient.findPersonByEmail(user.getEmail());
    promise.onRedeem(person -> {
        if (person.isPresent()) {
            restClient.addAddress(person.get().id, ua).onRedeem(address -> {
                ua.thirdPartyAddressId = String.valueOf(address.id);
                ua.thirdPartyUserId = String.valueOf(address.customerId);
                ua.save();

                Logger.info("Sync success.");
            });
        }
    });

    ObjectNode resultNode = Json.newObject();
    resultNode.set("address", Json.toJson(ua));
    return new Dummy(resultNode);
}

您对 restClient 进行异步调用,因此如果您希望操作反映调用结果并且是异步的,则需要 return 承诺。

在当前代码中,ObjectNode resultNode = Json.newObject(); .. 将在您放入 onRedeem 函数的代码之前 运行。即 a.thirdPartyAddressId = String.valueOf(address.id);.

要修复它,您必须链接异步调用并创建您的 Dummy 对象作为链的最后一个元素。

Chaining就是要用mapflatMaponRedeem相反。

你现在登录的地方需要to change the return typePromise<Result>和return你的Dummy对象。您还需要将 onRedeem 转换为 mapflatMap

我会建议你 to migrate to Play 2.6 and use CompletionStage 而不是 Promise

下一个代码只是一个草稿,我没有检查它,因为我没有那么多 类,就当是记叙文吧:

public Promise<Result> addUserAddress(final String userId) throws Exception {
    Address newAddress = AddressFrom.get();
    Address ua = new Address(user, 
    ThirdPartyApplication.findThirdPartyApplicationById(1));
    ua.save();

    Promise<Optional<Person>> promise = restClient.findPersonByEmail(user.getEmail());

    return promise.flatMap(person -> {
        if (person.isPresent()) {
            return restClient.addAddress(person.get().id, ua).map(address -> {
                ua.thirdPartyAddressId = String.valueOf(address.id);
                ua.thirdPartyUserId = String.valueOf(address.customerId);
                ua.save();

                Logger.info("Sync success.");

                ObjectNode resultNode = Json.newObject();
                resultNode.set("address", Json.toJson(ua));
                return new Dummy(resultNode);
                //return ok("Dummy test");
            });
        }
    });


}