2012-10-02 15 views
9

जब मैं Play 1.2 का उपयोग कर रहा था, तो मैं इस नियंत्रक के अंदर प्रत्येक अनुरोध के पहले या बाद में किसी विधि को निष्पादित करने के लिए @Before या @After (और अन्य ...) के साथ किसी भी नियंत्रक के अंदर कुछ विधियों को एनोटेट करने में सक्षम था।Play 1.2 से Play 2.0 समकक्ष और @ 1.2 के बाद क्या हैं?

मैं इसे Play 2.0 में कैसे कर सकता हूं?

मैं वैश्विक वस्तु के बारे में थोड़ा सा पढ़ता हूं, लेकिन ऐसा लगता है कि मैं जो खोज रहा हूं वह ऐसा नहीं लगता है। इसके अलावा, मैं जो करना चाहता हूं उसके लिए एक्शन कंपोज़िशन बहुत जटिल लगता है। मुझे कुछ आसान देखने की उम्मीद है।

कोई विचार?

उत्तर

8

दुर्भाग्य से, आपको के लिए action composition का उपयोग करना होगा, और @After के लिए कोई समकक्ष नहीं है।

@After के लिए, मैं अंतिम कार्रवाई के अंत में अपना खुद का after विधि लिखूंगा; अपने नियंत्रक में @Logs साथ

public static Result index() { 
    .... 
    Result result = ...; 
    return after(result); 
} 

protected static Result after(Result result) { 
    ... 
    Result afterResult = ..., 
    return afterResult 

} 
3
public class Logging { 

    @With(LogAction.class) 
    @Target({ElementType.TYPE, ElementType.METHOD}) 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface Logs { 

    } 

    public static class LogAction extends Action<Logs> { 

     private void before(Context ctx) { 
      System.out.println("Before action invoked"); 
     } 

     private void after(Context ctx) { 
      System.out.println("After action invoked"); 
     } 

     public F.Promise<Result> call(Http.Context context) throws Throwable { 
      before(context); 
      Promise<Result> result = delegate.call(context); 
      after(context); 
      return result; 
     } 
    } 

} 

पर टिप्पणी करें: कुछ इस तरह।