2012-10-02 12 views
9

Kiedy korzystałem z wersji 1.2, mogłem opisać niektóre metody w dowolnym kontrolerze za pomocą @Before lub @After (i innych ...) w celu wykonania metody przed lub po każdym żądaniu wewnątrz tego kontrolera.Co to są odpowiedniki Play 2.0 z @ Before i @After z Play 1.2?

Jak mogę to zrobić w wersji Play 2.0?

Przeczytałem trochę o obiekcie globalnym, ale nie wydaje mi się to, czego szukam. Również kompozycja akcji wydaje się zbyt skomplikowana w stosunku do tego, co chcę zrobić. Mam nadzieję, że zobaczę coś prostszego.

Wszelkie pomysły?

Odpowiedz

8

Niestety, musisz użyć action composition dla @Before i nie ma odpowiednika dla @After.

Dla @After, napisałem własną metodę after na końcu akcji końca; coś takiego:

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

} 

Annotate z @Logs w kontrolerze.

Powiązane problemy