9

当我使用 Play 1.2 时,我能够使用 @Before 或 @After (以及其他......)注释任何控制器内的一些方法,以便在该控制器内的每个请求之前或之后执行一个方法。

如何在 Play 2.0 中做到这一点?

我阅读了一些有关 Global 对象的信息,但它似乎不是我想要的。此外,对于我想做的事情来说,动作组合似乎太复杂了。我希望看到更简单的东西。

有任何想法吗?

4

2 回答 2

8

不幸的是,您必须对 使用动作组合@Before@After.

对于,我会在结束动作结束时@After编写自己的方法;after像这样的东西:

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

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

}
于 2012-10-02T06:30:42.637 回答
4
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; 
        }
    }

}

在控制器中使用 @Logs 进行注释。

于 2015-06-19T05:45:24.050 回答