我试图通过让我知道我在控制器中调用的函数的参数来制作更好的@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:我为什么要那样做?因为我有一些调用会产生几种不同类型的结果。由于我不想,因此缓存它们的结果很少是一种选择答案 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)
如果您知道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);
个对象:
{{1}}