2017-10-03 1 views
-1

J'utilise Play 2.6.3 et j'ai récemment effectué une mise à niveau depuis Play 2.5.x. J'ai des problèmes avec session et HTTPExecutionContext pour manipuler le cache comme le nouveau Play 2.6.x utilise EhCache.Play Framework 2.6 Session Async Java et HTTPExecutionContext

En jeu 2.5, il est assez simple à mettre en cache getOrUpdate la manière suivante:

User currentUser = cache.getOrElse(session("email"),() -> { 
      User user = User.find.byId(session("email")); 
      cache.set(user.email, user, Constants.CACHE_TIMEOUT); 
      return user; 
     }); 

Cela ne fonctionne en jeu comme ils l'ont désapprouvés la méthode getOrElse et ont plutôt créer getOrElseUpdate qui utilise l'API de cache & est défini par les interfaces AsyncCacheApi et SyncCacheApi. Donc, en bref le nouveau cache de retour CompletionStage au lieu de retourner directement T.

le nouveau code jeu 2.6:

CompletionStage<User> maybeCached = cache.getOrElseUpdate(session("email"),() -> lookUpUser()); 

    return maybeCached.thenApplyAsync(op -> { 
     return ok(views.html.dashboard.render("Dashboard", op, op.organization)); 
    }, httpExecutionContext.current()); 

public CompletionStage<User> lookUpUser() { 
    return CompletableFuture.supplyAsync(() -> User.find.byId(session("email")),httpExecutionContext.current()); 
} 

La fonction lookUpUser renvoie une erreur de: java.lang.RuntimeException: There is no HTTP Context available from here.

Toute aide serait apprécié.

Répondre

0

Vous devez utiliser le contexte d'exécution injecté dans le contrôleur:

https://www.playframework.com/documentation/2.6.x/JavaAsync#Using-HttpExecutionContext

import play.libs.concurrent.HttpExecutionContext; 
import play.mvc.*; 

import javax.inject.Inject; 
import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.CompletionStage; 

public class MyController extends Controller { 

    private HttpExecutionContext httpExecutionContext; 

    @Inject 
    public MyController(HttpExecutionContext ec) { 
     this.httpExecutionContext = ec; 
    } 

    public CompletionStage<Result> index() { 
     // Use a different task with explicit EC 
     return calculateResponse().thenApplyAsync(answer -> { 
      // uses Http.Context 
      ctx().flash().put("info", "Response updated!"); 
      return ok("answer was " + answer); 
     }, httpExecutionContext.current()); 
    } 

    private static CompletionStage<String> calculateResponse() { 
     return CompletableFuture.completedFuture("42"); 
    } 
} 

Vérifiez donc si votre httpExecutionContext exactement celui a été injecté dans le contrôleur comme HttpExecutionContext.

+1

Désolé de ne pas poster mon code de contrôleur complet. Mais j'ai déjà injecté et initialisé le contexte HTTPExecution et Cache dans le contrôleur – illusionx

+0

Et comme j'utilise la session dans ma fonction 'lookUpUser', il ne fait que lancer" No HTTP Execution Context Available " – illusionx