2017-09-26 12 views
1

私はプレイフレームワークを使用している初心者で、コードがデータベースに格納されているアドレスを更新していない理由がわかりません。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は、すべてmapflatMapの逆約onRedeemを使用しようとしています。

to change the return typePromise<Result>が必要です。今すぐログインする場所にDummyオブジェクトを戻してください。あなたはCONVER 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"); 
      }); 
     } 
    }); 


} 

次のコードは、私はすべてのこと のクラスを持っていないので、それを確認し、これだけの物語としてそれを使用していない、ただのドラフトであります

関連する問題