7

我试图通过让 @Cached 知道我在控制器中调用的函数的参数来制作更好的 @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结果实际上是 a ,它包装了它的play.mvc.Results.StatusScala 对应物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 回答
3

只是用最新的 2.3+ Playframework 方式更新此页面。

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

很容易。

于 2014-09-11T02:11:28.780 回答
2

如果您知道您Result是一个实例play.mvc.Results.Status(如果您使用play.mvc.Results该类中的任何静态辅助方法创建它),您可以将其转换为Status,并SimpleResult直接使用以下方法获取对象getWrappedSimpleResult()

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 回答