2011-06-01 37 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