Как вернуть результат из Action в Java Play Framework? - PullRequest
0 голосов
/ 16 января 2019

Все мои контроллеры используют этот 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 голосов
/ 16 января 2019

В соответствии с документацией в 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);

...