2017-09-26 72 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"); 
      }); 
     } 
    }); 


} 
相關問題