2011-06-01 79 views
4

今天早上我升級到了Play 1.2.1,所以我可以利用他們的新的異步編程和HTTP功能。Play Framework await()導致意外的異常

當我使用下面的示例時,從Play文檔(*我是 使用不同的方法名稱*),我收到一個UnexpectedException 錯誤。

public static void loopWithoutBlocking() { 
    for(int i=0; i<=10; i++) { 
     Logger.info(i); 
     await("1s"); 
    } 
    renderText("Loop finished"); 
} 


誤差如下:

Oops: UnexpectedException 

An unexpected error occured caused by exception UnexpectedException: 
While applying class play.classloading.enhancers.ContinuationEnhancer 
on controllers.Application 


上面的示例方法被放置在應用控制器中和我已經包括play.libs.F庫。

是否使用的await()調用需要嵌套更深層次的東西中的方法?

+0

我不明白?我創建了一個新的應用程序(使用Play 1.2),並用上面的代碼替換了索引方法,它運行良好。我沒有必要導入play.libs.F(因爲await是Controller的一部分)。我不得不改變記錄器,因爲編譯器抱怨,但就是這樣。你使用的是什麼版本的Java? – Codemwnci 2011-06-01 14:44:00

+0

@Codemwnci - 感謝您的回覆。我發現,當我從Application類剝離所有代碼並使用上面的代碼時,我沒有問題。出於某種原因,await()調用似乎與一種不相關的方法衝突。在用另一種方法整理代碼之後,問題自行解決。我不認爲我會永遠找出它的真正原因。 – 2011-06-01 15:52:07

+0

有可能您的其他方法或屬性之一意外地超過了Controller中等待依賴的方法?很高興它已經排序了。 – Codemwnci 2011-06-01 15:56:23

回答

2

爲防萬一遇到同樣的問題(它似乎也被其他人報告過),我認爲我最好總結我是如何解決這個問題的(儘管它可能不被視爲'答案'):

正如@Codemwnci和Julien Tournay @ Play-framework google group指出的那樣。問題中包含的代碼確實運行。

錯誤的真正原因是在應用程序類中的一些「無關」代碼似乎與的await()調用衝突。找到違規方法後,我整理了代碼,導致錯誤自行解決 - 但我無法確定問題的實際原因(並相信我,我確實看過)。

那麼,你問的答案是?

它不是的await()方法,它是別的東西在你的代碼......所以註釋掉除包含的await()調用的方法的一切,找到打破它的代碼。

玩得開心!

+0

我剛剛通過今天的問題解決了這個問題。我最終做了一些家務/重構來清理受影響的控制器類。在一天結束時,我只將方法轉移到其他更有意義的類。 值得注意的是,只有啓用了Play 1.x Cobertura插件後,我的失敗纔會發生。在重構之前,如果我禁用它,錯誤就會消失。 – 2013-11-04 22:48:09

1

看來,有關的await很多bug已經在1.2.4版本(目前的一個,當我書面方式這個答案)後得到修復。

所以很多問題都還沒有固定的和我面臨同樣類型的問題。

但有一個備用回購,位於:包含1.2.4版本遊戲的一些關鍵更新/修復,其中包括那些具有的await https://github.com/mbknor/play/tree/1.2.4-mbknor-custom-release

我試過了,對於我的問題,現在修復了。

也許它會幫你。

現在,如果播放1.2.5發佈時你會讀到這些線,它不應該是你的問題。

+1

+1謝謝。這在當時實際上是'1.2.2'的問題。我重新編寫了導致我遇到問題的代碼,因此我無法檢查是否有任何發行版實際上修復了這些問題 - 但這些信息對於發現他們與'await()'有問題的其他人有用。 – 2012-02-01 15:28:23

1

我今天偶然發現了這個問題,我注意到它實際上是由一個方法的長度造成的。是的,這是正確的,有一個太長的方法在導致問題的同一類中,提取一部分作爲另一種方法後,問題消失了!所以一定要檢查你的代碼。

+0

當我遇到這個問題時,有一個非常大的方法。這個方法被重構爲我調試問題的一部分 - 所以我認爲你可以在這裏做些什麼。我不認爲你有任何支持它的東西是漫長的方法嗎? – 2013-09-24 12:41:32

+0

沒有什麼可靠的,但一致的行爲,當我將原始方法的幾行提取到新方法中時,它開始工作,並且我可以在兩個狀態之間來回切換,並且它會非常一致。另外,在一個不相關的說明中,有時候我們遇到了類不會被增強的問題,所以我們必須添加公共靜態void dummy(){await(「1s」);}這可以解決這個問題。我怎麼把這個?我不喜歡這個框架。 – twihoX 2013-09-30 11:56:20