2017-10-03 31 views
-1

私はPlay 2.6.3を使用していますが、最近Play 2.5.xからアップグレードしました。 新しいPlay 2.6.xがEhCacheを使用するため、キャッシュを操作するためにsessionHTTPExecutionContextの問題が発生しています。プレイ2.5でPlay Framework 2.6 Java Async SessionおよびHTTPExecutionContext

それは次のようgetOrUpdateキャッシュにはかなり簡単だった:これは、彼らがgetOrElseメソッドを非推奨となり、代わりにしているとして劇中の作品はキャッシュAPI &を使用するgetOrElseUpdateを作成していないん

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

されますAsyncCacheApiインターフェースとSyncCacheApiインターフェースで定義されています。 ので、短い新しいキャッシュに直接T.

を返す代わりにCompletionStageを返す新しい演劇2.6コード:lookUpUser関数はのエラースロー

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

java.lang.RuntimeException: There is no HTTP Context available from here.

をすべてのヘルプは次のようになります感謝。

答えて

0

あなたはコントローラーに注入実行コンテキストを使用する必要があります。

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

あなたhttpExecutionContextは正確に一つがHttpExecutionContextとしてコントローラに注入したのであれば確認してください。

+1

私の完全なコントローラコードを投稿していただきありがとうございます。しかし、私はすでにHTTPExecutionコンテキストとキャッシュをコントローラに注入し初期化しています – illusionx

+0

そして、私の 'lookUpUser'関数でセッションを使用しているので、' HTTP実行コンテキストがありません ' – illusionx

関連する問題