Java 检查结果是否正常
我试图通过让@Cached注释知道我在控制器中调用的函数的参数,来创建一个稍微好一点的@Cached注释 所以我有这个动作:Java 检查结果是否正常,java,playframework,playframework-2.0,Java,Playframework,Playframework 2.0,我试图通过让@Cached注释知道我在控制器中调用的函数的参数,来创建一个稍微好一点的@Cached注释 所以我有这个动作: public class ContextualCachedAction extends Action<ContextualCached> { @Override public Result call(Context ctx) throws Throwable { try { String key = m
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()
}
}
公共类上下文缓存扩展操作{
@凌驾
公共结果调用(上下文ctx)抛出可丢弃的{
试一试{
字符串键=生成键(ctx);
整数duration=configuration.duration();
Result=(Result)Cache.get(key);
如果(结果==null){
结果=委托调用(ctx);
//TODO查找仅缓存成功调用的方法
Cache.set(键、结果、持续时间);
}
返回结果;
}捕获(运行时异常e){
投掷e;
}捕获(可丢弃的t){
抛出新的运行时异常(t);
}
}
私有字符串生成键(上下文ctx){
//从ctx.request()中的某些参数生成密钥
}
}
我的问题是:我想缓存delegate.call()的结果,前提是它是Ok()。
我要怎么查呢?
有房产吗?
一辆汽车?
还是需要确定().getClass().isInstance(结果)
谢谢你的回答和提示
PS:我为什么要这么做?因为我有一些调用会生成几种不同的结果。由于我不想让
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
}
如果您知道您的
结果
是play.mvc.Results.Status
(如果您使用play.mvc.Results
类中的任何静态帮助器方法创建了它,则可以将其强制转换为状态
,并直接使用GetWrappedImpleResult()获取SimpleResult
对象
:
不那么糟糕的方法:
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开始工作。仅使用最新的2.3+Playframework方法更新此页面
Result result = //.....
int httpStatus = result.toScala().header().status();
很简单。这是推荐的方法吗?要实现诸如检查响应状态代码之类的简单操作,这看起来非常尴尬和复杂。如果它不是
PlainResult
的实例怎么办?这是可行的,但要在生产代码(而不是测试代码)中使用它,我必须明确地向测试库添加一个依赖项,例如(对于Java 2.2.1):“com.typesafe.Play”%%“播放测试2.10”%%“2.2.1”
在哪里定义了OK
?
Result result = //.....
int httpStatus = result.toScala().header().status();