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

时间:2017-09-26 22:38:37

标签: java asynchronous playframework playframework-2.0

我是使用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);
}

1 个答案:

答案 0 :(得分:0)

您对restClient执行异步调用,因此如果您希望操作反映调用结果并且为异步,则需要返回promise。

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

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

Chaining即将使用与map相对的flatMaponRedeem

您需要to change the return typePromise<Result>并在您现在登录的地方返回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");
            });
        }
    });


}