2013-02-27 117 views
7

मैं अपने नियंत्रकों में कॉल किए गए फ़ंक्शन के पैरामीटर के बारे में जागरूक करके थोड़ा बेहतर @ कैश एनोटेशन बनाने की कोशिश कर रहा हूं।जांचें कि परिणाम एक ठीक 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 का परिणाम (कैश करने के लिए केवल अगर यह एक ठीक है चाहते हैं()। मैं इसके लिए कैसे जांच सकता हूं? क्या कोई संपत्ति है? एक उपयोग? या मुझे ठीक है()। GetClass()। IsInstance (परिणाम)?

किसी भी उत्तर और संकेत के लिए धन्यवाद।

पीएस: मैं ऐसा क्यों करना चाहता हूं? क्योंकि मेरे पास कुछ कॉल हैं जो विभिन्न प्रकार के विभिन्न परिणाम उत्पन्न करती हैं। कुछ पर्याप्त परिणाम है कि उन्हें कैशिंग एक विकल्प हो सकता है के बाद से मैं

उत्तर

6

एक ok परिणाम नहीं करना चाहते वास्तव में एक play.mvc.Results.Status जो अपने स्काला समकक्ष play.api.mvc.Results.Status, जो बारी में अपने status कोड 200

पर सेट है लपेटता है तो आप result.getWrappedResult() पर कॉल करें और जांचें कि यह प्रकार सही है या नहीं, इसे PlainResult (सबसे कम आम denominator) पर डालें और 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

यह काम किया ... धन्यवाद –

+3

क्या यह करने का यह अनुशंसित तरीका है? प्रतिक्रिया स्थिति कोड – knittl

+0

की जांच करने जैसे कुछ सरल प्राप्त करने के लिए यह वास्तव में अजीब और जटिल लगता है यदि यह 'PlainResult' का उदाहरण नहीं है तो क्या होगा? – jlars62

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

कम sucky दृष्टिकोण:

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

यह काम करता है, लेकिन उत्पादन कोड (टेस्ट कोड में नहीं) में इसका उपयोग करने के लिए, मुझे व्याख्या पुस्तकालयों में निर्भरता जोड़नी पड़ती थी, उदाहरण के लिए (जावा 2.2.1 के साथ खेलने के लिए): 'com.typesafe.play "%" play-test_2.10 "%" 2.2.1 "' –

+0

' ओके 'कहां परिभाषित किया गया है? –

3

बस इस पृष्ठ को नवीनतम 2.3+ Playframework करने के तरीके को अपडेट करने के लिए।

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

पर्याप्त आसान है।