2012-10-02 2 views
9

Als ich Play 1.2 benutzte, war ich in der Lage, einige Methoden in jedem Controller mit @Before oder @After (und anderen ...) zu kommentieren, um eine Methode vor oder nach jeder Anfrage innerhalb dieses Controllers auszuführen.Was sind Play 2.0-Äquivalente von @Before und @After von Play 1.2?

Wie kann ich das in Play 2.0 tun?

Ich lese ein wenig über das globale Objekt, aber es scheint nicht das zu sein, wonach ich suche. Außerdem scheint die Action-Komposition viel zu komplex für das, was ich tun möchte. Ich hoffe etwas einfacher zu sehen.

Irgendwelche Ideen?

Antwort

8

Leider müssen Sie action composition für die @Before verwenden, und es gibt keine Entsprechung für die @After.

Für die @After, würde ich meine eigene after Methode am Ende der Endaktion schreiben; so etwas wie dieses:

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

} 

Beschriften mit @Logs in Ihrem Controller.