如何从Java Play Framework中的操作返回结果?

时间:2019-01-15 23:22:21

标签: java controller frameworks action playback

我所有的控制器都使用我创建的CheckDowntimeAction

@Singleton
@With(CheckDowntimeAction.class)
public class MyController extends Controller {
}

按预期,在每个请求上,CheckDowntimeAction都会显示“我在这里!”。但是如何在CheckDowntimeAction内部中止操作,以便如果站点关闭,我将返回在CheckDowntimeAction中创建的自己的结果?

public class CheckDowntimeAction extends play.mvc.Action.Simple {
    @Override
    public CompletionStage<Result> call(Http.Request req) {
        logger.info("I'm here!");

        // just move along, nothing to see here
        return delegate.call(req);
    }
}

这可行,但是它会打印停机时间结果之后 MyController已经运行完毕。我希望它在控制器完成之前运行

public class CheckDowntimeAction extends play.mvc.Action.Simple {
    @Override
    public CompletionStage<Result> call(Http.Request req) {
        if (downtime) {
           Result r = badRequest("Site is down");

           // before Play 2.7, this would have been:
           // return F.Promise.pure(badRequest(r));

           return delegate.call(req).thenApply(result -> r);
        }

        // just move along, nothing to see here
        return delegate.call(req);
    }
}

请注意,这使用的是Java Play 2.7,它使用请求而不是上下文,并且F.Promise不再可用。参见https://www.playframework.com/documentation/2.7.x/JavaHttpContextMigration27

1 个答案:

答案 0 :(得分:0)

根据https://www.playframework.com/documentation/2.5.1/api/java/play/libs/F.Promise.html F.Promise中的文档已弃用,它表示改为使用CompletableFuture.completedFuture。 Play 2.7中的更改是F.Promise最终被完全删除。

我相信正确的Play 2.7方式是:return CompletableFuture.completedFuture(r);