我是使用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);
}
答案 0 :(得分:0)
您对restClient
执行异步调用,因此如果您希望操作反映调用结果并且为异步,则需要返回promise。
在当前代码中ObjectNode resultNode = Json.newObject(); ..
将在您放入onRedeem
函数的代码之前运行。即a.thirdPartyAddressId = String.valueOf(address.id);
。
要修复它,您必须链接异步调用并创建Dummy
对象作为链的最后一个元素。
Chaining
即将使用与map
相对的flatMap
和onRedeem
。
您需要to change the return type到Promise<Result>
并在您现在登录的地方返回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");
});
}
});
}