2012-10-02 12 views
9

Durante l'utilizzo di Play 1.2, sono stato in grado di annotare alcuni metodi all'interno di qualsiasi controller con @Before o @After (e altri ...) per eseguire un metodo prima o dopo ogni richiesta all'interno di questo controller.Quali sono gli equivalenti di Play 2.0 di @Before e @After di Play 1.2?

Come posso farlo in Play 2.0?

Ho letto un po 'sull'oggetto Global, ma non sembra essere quello che sto cercando. Inoltre, la composizione dell'azione sembra troppo complessa per quello che voglio fare. Spero di vedere qualcosa di più semplice.

Qualche idea?

risposta

8

Sfortunatamente, è necessario utilizzare action composition per @Before e non esiste alcun equivalente per @After.

Per il @After, scriverei il mio metodo after all'ultima azione; qualcosa di simile:

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; 
     } 
    } 

} 

Annotare con @Logs nel controller.

Problemi correlati