Java 检查结果是否正常

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

我试图通过让@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()
    }
}
公共类上下文缓存扩展操作{
@凌驾
公共结果调用(上下文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();