2017-09-26 97 views
1

我是一个使用play framework的新手,我需要一些帮助,因为我找不到代码没有更新存储在数据库中的地址的原因。Play Framework 2.4.x在回调函数中执行保存操作

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

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

在此先感谢

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

你做的restClient异步调用,所以你需要,如果你想行动,以反映调用的结果,并异步返回承诺。

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

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

Chaining即将使用mapflatMaponRedeem相对。

您需要to change the return typePromise<Result>并在您现在登录的地方返回Dummy对象。您还需要CONVER onRedeemmapflatMap

我劝你to migrate to Play 2.6 and useCompletionStage而不是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"); 
      }); 
     } 
    }); 


} 
相关问题