2013-02-27 18 views
7

我想通過讓它知道我在我的控制器中調用的函數的參數稍微好一點@Cached註釋。檢查結果是好的playframework

所以我有這樣的動作:

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() 
    } 
} 

我的問題是這樣的:我想緩存delegate.call的()的結果,只有當它是一個不錯的()。 我該如何檢查? 有沒有房產? util? 或者我需要Ok()。getClass()。isInstance(result)?

感謝您的任何答案和提示。

PS:爲什麼我想這樣做?因爲我有一些調用產生幾種不同的結果。很少有足夠的結果緩存他們可能是一個選擇,因爲我不想

回答

6

ok結果實際上是一個play.mvc.Results.Status它封裝了斯卡拉對應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 
    } 
+0

這工作......謝謝 – 2013-02-28 16:35:23

+3

這是推薦的方法嗎?這似乎非常尷尬和複雜,以實現一些簡單的事情,比如檢查響應狀態代碼 – knittl 2014-01-03 08:50:05

+0

如果它不是'PlainResult'的實例呢? – jlars62 2014-09-06 20:30:44

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); 
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開始。

+0

這可行,但要在生產代碼中使用它(而不是在測試代碼中),我必須明確地向測試庫添加一個依賴項,例如, (用於使用Java 2.2.1的Play):''com.typesafe.play「%」play-test_2.10「%」2.2.1「' – 2014-04-30 12:00:16

+0

'OK'定義在哪裏? – 2014-07-06 07:22:47

3

只是用最新的2.3+ Playframework方式更新本頁面。

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

很容易。