0

我不确定这是否没有按预期工作,这只是我感到困惑。

我想做的是异步延迟一个动作,await(int millis)我似乎可以成为朋友。

这是发生的事情:

1. Application.index显示一个发送 POST 到的表单Application.something

应用程序/控制器/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. Play 引发应用程序错误:“模板 Application/something.html 不存在”

因此,当在执行被暂停/恢复后被render()调用时,它会尝试渲染 的模板,这当然不存在。Application.indexApplication.somethingApplication.something

如果我删除await(500)一切正常(发出 302index并按预期呈现)。

我可以强制重定向

redirect("/");

并得到我想要的结果,但这感觉很难看。

我也可以设置

request.action = "Application.index";

await按预期在和 作品中的渲染Application.index(实际上是作品中的魔力)之后手动进行Controller.template()


所以基本上,一切都好,我被迫在调用之后使用字符串await而不是方法调用,还是有点不对劲?

干杯,托拜厄斯。

4

1 回答 1

0

当你调用 await() 方法时,Play 会挂起这个 HTTP 请求。超时后,它作为一个新的 HTTPRequest 再次启动,就好像再次被调用一样。

在第一种情况下,如果没有 await() 方法,重定向会正确发生 - 这是因为该方法调用被 Play 框架正确拦截,并且路由器反向路由生成创建发出 302 重定向所需的 URL。(ActionChaining 文档中的详细信息)

但是,在第二种情况下,在 await() 方法之后,会创建一个新的 HTTPRequest,并且不会发生任何操作链接——这意味着框架不会拦截对 index() 方法的调用。这与任何其他方法一样执行,因此您看不到重定向。

于 2011-09-12T17:34:57.027 回答