Цепочка действий не перенаправляет после 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(). Это выполняется как любой другой метод, поэтому вы не видите перенаправления.