2011-09-06 19 views
0

我不確定這是否按預期工作,它只是讓我感到困惑。Controller.await(int millis)之後的動作鏈接不重定向

我想要做的是異步延遲一個動作,並且我似乎能夠成爲朋友。

這裏發生了什麼:

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

的app/controllers/Application.java

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

    // Here be business 

    index(); 
} 

播放引發應用程序錯誤:「模板應用/ something.html不存在」

所以當render()被稱爲Application.indexApplication.something執行已暫停後/恢復它試圖渲染Application.something模板,這當然是不存在的。

如果我刪除await(500)一切正常(302發佈和index按預期呈現)。

我可以強制重定向與

redirect("/"); 

,並得到我想要的結果,但這種感覺難看。

我還可以設置

request.action = "Application.index"; 

await後手動權和Application.index作品(實際上,在Controller.template()作品魔術)如預期的渲染。


因此,基本上,是一切OK,我不得不忍受await而不是方法調用後使用字符串,或者是一些有點過?

乾杯, Tobias。

回答

0

當您調用await()方法時,Play暫停此HTTP請求。在超時之後,它再次作爲新的HTTPRequest重新開始,就好像再次被調用一樣。

在第一種情況,而不AWAIT()方法,重新定向發生正確 - 這是因爲此方法調用正確地播放框架攔截和路由器的反向路徑生成創建發出302重新所需的URL直接。 (ActionChaining文檔中的詳細信息)

但是,在第二種情況下,在await()方法之後,會創建一個新的HTTPRequest並且沒有動作鏈發生 - 意味着框架不會攔截對index()方法的調用。這與其他方法一樣執行,因此您不會看到重新指定。

+0

感謝您的回答,雖然它聽起來像您的解釋是等待1.2版之前沒有使用延續。我認爲1.2之後的等待點是不重新運行整個請求。 :○ – Tobias