使用路由控制器时,IntelliJ IDEA报告突出显示错误

35

我有一个Scala Play项目。我正在使用Play 2.2.1。我下载了Scala、Play 2支持和SBT插件。一切都很好,但是当我在控制器中调用Action的route时出现以下错误(请参见截屏):

Screenshot1

Screenshot2

我正在使用IntelliJ IDEA 12.1.6 Ultimate版本。Scala版本为2.10.2

有人知道如何解决这个问题吗?

提前致谢!


编辑

当我通过play控制台中的“play idea”命令将我的项目生成到Intellij IDEA中时,我打开了项目结构如下:

screenshot6

然后我看到了@millhouse的答案并在此GitHub页面上进行了讨论([Play 2.2] "play idea" creates not working source mapping in target),并从源文件夹中删除了以下文件夹:

  • target\scala-2.10\src_managed\main\controllers
  • target\scala-2.10\src_managed\main\views

然后,“Report highlighting error”消失了,但现在出现了另一个错误:

screenshot3

以及

screenshot7

我的路由:

screenshot4

我已按以下所示更改了“源文件夹”:

screenshot5

但这并没有帮助我,仍然出现“未指定值参数”错误。


1
升级到Intellij IDEA 13并使用“文件->导入项目”选项,选择“SBT项目”。不再需要使用“play idea”生成idea文件。 - Markus Jura
1
这是针对此问题的 Bug 报告:https://github.com/playframework/playframework/issues/1784 - Piotr Sobczyk
这可能与以下问题有关:https://youtrack.jetbrains.com/issue/SCL-7726 - Martin
2个回答

50

Millhouse的回答帮助我找到了正确的答案。Play 2.2(以及早期版本,没有进行检查)会将路由文件输出为Scala版本到project_dir/target/scala-2.10/src_managed/main所以为了使IntelliJ正确高亮显示,您需要确保将src_managed/main作为源文件夹添加。JavaScript的反向路由在某些情况下会包含在project_dir/target/scala-2.10/classes_managed中,因此您还需要将其添加进去。(在您的截图中,看起来classes_managed被设置为排除,因此您需要按右侧的“x”按钮取消排除。)

这是我的项目结构屏幕截图:

Working Play 2.2 project structure

更新:

在Play 2.3(或最近的IntelliJ版本)中,添加classes_managed不再解决问题。相反,将其添加到依赖项中。通过这样做,IntelliJ应该能够获取已编译的routes.class。

Working Play 2.3 dependency list


2
如果仍然出现错误,执行“文件>使缓存无效”并重启可能会有帮助。 - wm_eddie
太棒了!像魔法一样顺利运行! - Karlth
3
我没有 classes_managed 文件夹(play-scala-intro 模板,Play 2.4.1):( - Nelson Tatius
3
我仍在努力弄清楚如何使它与Play 2.4兼容并正常工作… - wm_eddie
@wm_eddie:尝试从头重新导入项目,即删除/重命名.idea子目录并重新按照以下说明操作:https://www.jetbrains.com/help/idea/2016.1/getting-started-with-play-2-x.html#import_project - 在我的情况下解决了问题。似乎在升级IDEA / Play时留下了一些垃圾。 - Jxtps
对于 Play 2.3,您必须将 src_managed/main 文件夹标记为源文件,以便识别路由包。在 IntelliJ 2016.1.1 上使用此方法可行。 - Aphax

8

这是一个常见的问题,因为IntelliJ需要指定查找编译后的Scala模板和routes文件的位置。以下是我在IntelliJ 12.1上解决此问题的方法:

  • 在IntelliJ中选择项目的Module Settings(选择顶级项目,按F4)
  • 在出现的Project Structure窗口中选择Modules项目
  • 选择projectname项目(而不是projectname-build项目)
  • 将编译器的输出目录添加到Source Folders项中;
    • 对于Scala 2.10,它是target/scala-2.10/classes
    • 我个人认为IntelliJ UI很不直观,您可能需要先从Excluded Folders中删除target目录和/或其中一个子目录
  • 应用更改后,IntelliJ应该将编译每个routes和.scala.html文件的结果视为另一个源文件,因此它们不会显示为“broken”,并且自动完成应该适用于它们。

@ Millhouse 为什么只在源文件夹中添加“target/scala-2.10/classes/views”?为什么不在源文件夹中添加“target/scala-2.10/classes/controllers”和“target/scala-2.10/classes/models”文件夹呢? - SBotirov
1
@mr.boyfox 没错,我已经更新了我的答案,这样你的 routes.scala.html 模板文件都应该被捕捉到了。 - millhouse
谢谢@millhouse,我尝试了这个方法但出现了另一个错误,请看我的编辑。 - SBotirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接