我不确定这是不是按预期工作,只是让我感到困惑。
我想做的是异步延迟一个动作,await(int millis)
我似乎能够成为朋友。
以下是发生的事情:
1。 Application.index
会显示一个向Application.something
发送POST的表单。
应用/控制器/ Application.java
public static void index() {
render();
}
应用/视图/应用/ 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. 播放引发应用程序错误:“模板Application / something.html不存在”。
因此,render()
中的Application.index
在Application.something
中执行后Application.something
被暂停/恢复时,会尝试呈现await(500)
的模板,当然这不是存在。
如果删除index
,一切正常(发布302并按预期呈现redirect("/");
)。
我可以使用
强制重定向request.action = "Application.index";
并得到我想要的结果,但这感觉很难看。
我也可以设置
await
在Application.index
之后手动操作,Controller.template()
中的渲染工作(实际上,await
中的魔法按预期工作)。
所以基本上,一切都还可以,我被迫在{{1}}之后使用字符串而不是方法调用,或者有点不对劲?
干杯, 托拜厄斯。
答案 0 :(得分:0)
当您调用await()方法时,Play会暂停此HTTP请求。超时后,它再次作为新的HTTPRequest启动,就像再次调用一样。
在第一种情况下,没有await()方法,重定向正确发生 - 这是因为Play框架正确拦截了此方法调用,并且路由器反向路由生成创建了发布302重定向所需的URL 。 (ActionChaining文档中的详细信息)
但是,在第二种情况下,在await()方法之后,创建了一个新的HTTPRequest,并且没有发生动作链接 - 这意味着框架不会拦截对index()方法的调用。这与任何其他方法一样执行,因此您看不到重定向。