2013-02-27 8 views
7

コントローラで呼び出す関数のパラメータを認識させることで、より良い@Cachedアノテーションを作成しようとしています。結果がokであることを確認するplayframework

ので、私は、このアクションを持っている:

public class ContextualCachedAction extends Action<ContextualCached> { 

    @Override 
    public Result call(Context ctx) throws Throwable { 
     try { 
      String key = makeKey(ctx); 
      Integer duration = configuration.duration(); 
      Result result = (Result) Cache.get(key); 
      if (result == null) { 
       result = delegate.call(ctx); 

       //TODO find a way to cache only successful calls 

       Cache.set(key, result, duration); 
      } 
      return result; 
     } catch (RuntimeException e) { 
      throw e; 
     } catch (Throwable t) { 
      throw new RuntimeException(t); 
     } 
    } 

    private String makeKey(Context ctx) { 
     //makes the key from some parameters in the ctx.request() 
    } 
} 

私の質問はこれです:私はdelegate.call(の結果をキャッシュしたいと思います)、それはOK(ある場合のみ)。 どうすれば確認できますか? プロパティはありますか? a util? またはOK()。getClass()。isInstance(result)にする必要がありますか?

ご回答いただきありがとうございます。

PS:なぜ私はそれをしたいですか?私はいくつかの種類の結果を生成する呼び出しをいくつか持っているからです。私は

答えて

6

ok結果にしたくないので、それらをキャッシュするオプション可能性があり、いくつかの十分な結果が実際に順番にそのstatusコードが200

に設定されているそのScalaの対応play.api.mvc.Results.Statusを、ラップplay.mvc.Results.Statusですだからresult.getWrappedResult()に電話して、そのタイプが正しいかどうかを確認して、それがPlainResult(最小公約数)にキャストし、statusと呼んでください。

これはしかし非常に醜い:

play.api.mvc.Result wrappedResult = result.getWrappedResult(); 
    if (wrappedResult instanceof play.api.mvc.PlainResult) { 
    play.api.mvc.PlainResult plainResult = (play.api.mvc.PlainResult)wrappedResult; 
    int code = plainResult.header().status(); 
    if (code == OK) 
     // Cache 
    } 
+0

ありがとう –

+3

これを行うには、これをお勧めしますか?これは、応答ステータスコードをチェックするのと同じような単純なものを達成するのは、実際には面倒で複雑なようです。 – knittl

+0

'PlainResult'のインスタンスではない場合はどうなりますか? – jlars62

2

あなたのResultがあなたをキャストすることができます(あなたがplay.mvc.Resultsクラスから静的ヘルパーメソッドのいずれかを使用して、それを作成した場合、それはある)play.mvc.Results.Statusのインスタンスであることがわかっている場合それStatusに、直接getWrappedSimpleResult()を使用してSimpleResultオブジェクトを取得:

Status result = (Status) YourController.actionHandler(); 
int expected = Results.ok() 
     .getWrappedSimpleResult().header().status(); 
int actual = result.getWrappedSimpleResult().header().status(); 
Assert.assertEquals(expected, actual); 
8

あまり嫌なアプローチを:

import org.junit.*; 
import static org.fest.assertions.Assertions.assertThat; 
import static play.test.Helpers.*; 

/* do stuff */ 

Result result = doSomethingWithController(); 
assertThat(status(result)).isEqualTo(OK); 

2.2.2以降で動作します。

+0

これは動作しますが、テストコードではなく実動コードで使用するためには、テストライブラリに依存性を追加する必要がありました。 (Play with Java 2.2.1): '' com.typesafe.play "%" play-test_2.10 "%" 2.2.1 "' –

+0

'OK'はどこに定義されていますか? –

3

最新の2.3+ Playframeworkでこのページを更新するだけです。

Result result = //..... 
int httpStatus = result.toScala().header().status();