2017-09-26 2 views
1

Je suis un novice utilisant le framework de jeu et j'ai besoin d'aide car je ne trouve pas la raison pour laquelle le code ne met pas à jour l'adresse stockée dans la base de données.Play Framework 2.4.x exécuter une opération de sauvegarde dans une fonction de rappel

Je peux voir le journal indiquant le succès mais je ne vois pas le changement de données reflété; Je ne sais pas si c'est quelque chose qui ne va pas avec le code ou si je dois passer un contexte.

Cet exemple de code doit stocker dans la base de données, puis nous obtenons une communication réussie avec la mise à jour tiers certains champs de manière asynchrone.

Merci à l'avance

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); 
} 

Répondre

0

Vous ne les appels asynchrones au restClient, vous devez retourner la promesse si vous voulez que l'action reflète le résultat de l'appel et être async.

Dans le code actuel ObjectNode resultNode = Json.newObject(); .. sera exécuté avant le code que vous avez placé dans la fonction onRedeem. c'est-à-dire a.thirdPartyAddressId = String.valueOf(address.id);. Pour résoudre ce problème, vous devez enchaîner les appels asynchrones et créer votre objet Dummy en tant que dernier élément de la chaîne.

Chaining est tout sur le point d'utiliser map et flatMap opposée à onRedeem.

Vous avez besoin de to change the return type à Promise<Result> et de renvoyer votre objet Dummy à l'endroit où vous vous connectez maintenant. Vous devez également Conver onRedeem à map et flatMap

Je vous conseille to migrate to Play 2.6 and useCompletionStage au lieu de Promise.

code suivant est juste un projet, je n'ai pas vérifié parce que je n'ai pas tout ce que les classes, afin de l'utiliser comme un récit:

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"); 
      }); 
     } 
    }); 


}