7

コントローラーで呼び出す関数のパラメーターを認識させることで、@Cached アノテーションを少し改善しようとしています。

だから私はこのアクションを持っています:

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

私の質問は次のとおりです。OK() の場合にのみ、delegate.call() の結果をキャッシュしたいと思います。どうすればそれを確認できますか?物件はありますか?ユーティリティ?または Ok().getClass().isInstance(result) する必要がありますか?

答えとヒントをありがとう。

PS : なぜそれをしたいのですか? 数種類の異なる結果を生成する呼び出しがいくつかあるためです。私はしたくないので、それらをキャッシュすることがオプションになる可能性がある十分な結果はほとんどありません

4

4 に答える 4

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 以降で動作します。

于 2014-04-22T02:38:51.487 に答える
6

ok結果は、実際には、play.mvc.Results.Status対応するScalaをラップするものでplay.api.mvc.Results.Statusあり、対応するstatusコードは200に設定されています。

したがって、呼び出し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
  }
于 2013-02-27T18:07:00.053 に答える
2

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

Status result = (Status) YourController.actionHandler();
int expected = Results.ok()
        .getWrappedSimpleResult().header().status();
int actual = result.getWrappedSimpleResult().header().status();
Assert.assertEquals(expected, actual);
于 2014-02-02T21:53:08.023 に答える