检查结果是否正常

时间:2013-02-27 16:49:10

标签: java playframework playframework-2.0

我试图通过让我知道我在控制器中调用的函数的参数来制作更好的@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 个答案:

答案 0 :(得分: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起作用。

答案 1 :(得分: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
  }

答案 2 :(得分:3)

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

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

很容易。

答案 3 :(得分:2)

如果您知道Resultplay.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); 个对象:

{{1}}