Цепочка действий не перенаправляет после Controller.await(int millis)

Я не уверен, что это не работает так, как задумано, просто я запутался.

Что я хотел бы сделать, это асинхронно задержать действие, и await(int millis) и я, кажется, могу стать друзьями.

Вот что происходит:

1. Application.index отображает форму, которая отправляет POST Application.something,

приложение / контроллеры /Application.java

public static void index() {
    render();
}

Приложение / просмотров / Application/ index.html

#{form @Application.something()}
    <input type="submit">
#{/form}

2. Application.something делает свое дело, а затем возвращается index,

приложение / контроллеры /Application.java

public static void something() {
    await(500);

    // Here be business

    index();
}

3. Play вызывает ошибку приложения: "Шаблон Application/thing.html не существует".

Так когда render() называется в Application.index после казни в Application.something был приостановлен / возобновлен, он пытается отобразить шаблон Application.somethingчто, конечно, не существует.

Если я удалю await(500) все работает просто отлично (302 выдается и index отображается как и ожидалось).

Я могу принудительно перенаправить с

redirect("/");

и получить результат, который я хочу, но это ужасно.

Я также могу установить

request.action = "Application.index";

вручную сразу после await и рендеринг в Application.index работает (на самом деле, магия в Controller.template() работает) как задумано.


В общем, все в порядке, и я вынужден жить с использованием строк после await а не вызовы методов или что-то не так?

Приветствия, Тобиас.

1 ответ

Когда вы вызываете метод await(), Play приостанавливает этот HTTP-запрос. После истечения времени ожидания он снова запускается как новый запрос HTTPRequest, как будто вызывается снова.

В первом случае, без использования метода await(), перенаправление происходит правильно - это потому, что этот вызов метода правильно перехватывается платформой Play, а при генерации обратного маршрута маршрутизатора создается URL-адрес, необходимый для перенаправления 302. (Подробности в документации ActionChaining)

Но во втором случае после метода await() создается новый HTTPRequest, и цепочка действий не происходит - это означает, что среда не перехватывает вызов метода index(). Это выполняется как любой другой метод, поэтому вы не видите перенаправления.

Другие вопросы по тегам