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
就是要用map
和flatMap
与onRedeem
相反。
你现在登录的地方需要to change the return type到Promise<Result>
和return你的Dummy
对象。您还需要将 onRedeem
转换为 map
和 flatMap
我会建议你 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");
});
}
});
}
我是一个使用 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
就是要用map
和flatMap
与onRedeem
相反。
你现在登录的地方需要to change the return type到Promise<Result>
和return你的Dummy
对象。您还需要将 onRedeem
转换为 map
和 flatMap
我会建议你 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");
});
}
});
}