Playframework: 确保反向路由与 IntelliJ 中 Java 项目的 vanilla play 想法一起工作

创建于 2013-04-08  ·  49评论  ·  资料来源: playframework/playframework

在 Java 项目中,IntelliJ 似乎将反向路由视为语法错误。

最有用的评论

我已经取消了项目根目录中target文件夹的排除。 现在它工作正常!

所有49条评论

确切的问题是什么? 我可以打开一个普通的 play-java 项目进入 idea 并毫无问题地访问反向路由。 但我看到了其他一些问题:

  • route.java 显示错误
  • ok(index.render(...)) 也显示错误。 我对这个感到惊讶。

我也只是碰巧注意到了这一点(我最初提出的请求是针对其他人的)。

IntelliJ 12.1 似乎无法推断从 Java 代码调用的 Scala 方法的返回类型,如果它们返回泛型类型。

控制器抱怨的原因是项目没有编译,因此没有生成反向路由文件。 因此,如果您在 IDE 中打开之前编译项目,该错误应该会消失。 第二个问题是,如果您尝试构建项目会失败,因为我们没有为 Java 项目添加 Scala Facet。 我认为正确的解决方法应该是在自动生成 IDEA 项目文件之前运行编译任务(我们为 eclipse 这样做)并为 Scala 和 Java 项目添加 Scala 方面。

问题是没有为 SbtIdeaPlugin 分配 preTasks 的机制,我找不到挂钩“idea”命令的方法。 因此,暂时我们可以添加 Scala 方面并在文档中提及运行 compile 以修复任何其他编译问题。 想法?

似乎不止这些。 我启用了 scala facet(我认为),但仍然出现突出显示错误。 在 Scala 项目中它似乎可以工作,但是 routes.java 生成的文件中有错误。 我认为这实际上是由 IntelliJ 问题引起的。

IntelliJ 已打开问题:http: //youtrack.jetbrains.com/issue/IDEA-106570

在我的机器上,这似乎只影响routes.javascript.*routes.ref.* 。 在IDEA中打开生成的文件target/scala-2.10/src_managed/main/controllers/routes.java可以很容易的看到:

screen38

  • 第一部分就可以了,IDEA 可以轻松导航到controllers.ReverseApplication ,例如,它在另一个生成的文件target/scala-2.10/src_managed/main/routes_reverseRouting.scala
  • 第二部分和第三部分(javascript 和 ref)将所有类名都涂成红色作为语法错误:IDEA 找不到像 new controllers.javascript.ReverseApplication而实际上它们在同一个routes_reverseRouting.scala文件中

所以,我的假设是:问题可能是由于在单个 Scala 文件routes_reverseRouting.scala中定义了许多包和类这一事实引起的吗? 这确实可能是 IntelliJ 的 Scala 插件的一个已知限制:如果我们打开这个routes_reverseRouting.scala并导航到其中的任何package xxx行,我们将看到它以诚实的警告突出显示

不确定如何解决这个问题,但我们可以在这里同步文件夹结构和包结构吗? 文件routes.java已经放在controller文件夹中,IDEA处理的很好,所以大概routes_reverseRouting.scala也可以拆分成三个文件放到这个文件夹下吧?

哈哈,更简单的解决方法:我在图片上的controllers目录下创建了空目录javascriptref ,IDEA就搞定了。 routes.java和我的控制器中的语法错误都消失了,并且完成工作。 所以scala插件实际上_can_处理的包结构与目录结构并不相似,而是偶然发现了它不知道的包的名称。

我正在运行一个 Scala 项目,实际上遇到了同样的问题。 看起来我的控制器没有定义任何方法(除了从 java.lang.Object 派生的那些)。

我无法使用 IntelliJ 12.1.4 和 Scala 插件 0.16.293 重现此问题。 请注意,我还有来自 JetBrains 的 Play 2.0 Support 插件:0.16.294

完全一样的问题。 IDEA 12.1.5 无法识别反向路由中的控制器方法。 尝试重新编译并创建 ref 和 javascript 文件夹。

即使对于使用最新的 intellij-scala 插件并播放 2.2.1-RC1 的 Scala 项目,这仍然是一个问题

@OlegYch包括 IntelliJ 13?

在 2013 年 12 月 5 日星期四凌晨 2:52:23,克里斯托弗·亨特写道:

@OlegYch https://github.com/OlegYch包括 IntelliJ 13?


直接回复此邮件或在 GitHub 上查看
https://github.com/playframework/playframework/issues/969#issuecomment -29858570。

是的
与 sbt-idea 1.6.0-SNAPSHOT 非反向路由解析
与玩的想法只有常规路线解决http://prntscr.com/28s1g5
这是使用 idea 133.193 (13 final) 和 scala/play plugins v 0.26.319

谢谢,阿莱

IntelliJ 问题仍然悬而未决,因此我认为我们可以暂时将其关闭。

为什么不直接生成 ref 和 javascript 文件夹来解决它?

当然,将其添加到您的构建中:

sourceGenerators in Compile <+= sourceManaged in Compile map { dir: File =>
  val dirs = Seq(dir / "ref", dir / "javascript")
  dirs.foreach(_.mkdirs)
  dirs
}

我认为应该是:

val dirs = Seq(dir / "main" / "controllers" / "ref", dir / "main" / "controllers" / "javascript")

对?

无论如何,编译以错误结束:

[error] source file '.../target/scala-2.10/src_managed/main/controllers/javascript' could not be found

是的,它不起作用。

这应该有效

    sourceGenerators in Compile += task {
      val dir: File = (sourceManaged in Compile).value / "controllers"
      val dirs = Seq(dir / "ref", dir / "javascript")
      dirs.foreach(_.mkdirs)
      Seq[File]()
    }

为什么这么难释放?
每个用户都应该解决这样的问题吗 #1784 ?

更容易修复——在 IntelliJ 中取消将“控制器”和“视图”标记为源根,并将“main”标记为源根。 这修复了语法突出显示/完成/等。

+10(我必须手动更改每个模块1个)

请注意http://youtrack.jetbrains.com/issue/SCL-5635保持打开状态。 如果你觉得我们可以解决这个问题,那么请打开一个相关的 PR。 谢谢。

我通过更改 IDEA 项目的模块设置中的源路径找到了解决此问题的方法,如下所述:
http://www.jensjaeger.com/2013/09/play-framework-2-2-in-intellij-errors-in-controllers-everywhere/

这是 sbt-idea 的问题。 解决方法是取消将控制器目录(例如 target/scala-2.11/src_managed/main/controllers)标记为源根目录,并将主文件夹(例如 target/scala-2.11/src_managed/main)标记为源根目录。 然后 IntelliJ 会正确找到所有内容。 这确实应该修复,或者通过更改 Play 放置编译的路由文件的位置(因为 sbt-idea 期望所有内容都放入 compile:managedSources 内的子文件夹中),或者将其作为 sbt-idea 中的错误提交。

该错误在 sbt-idea 中。 Play 必须将编译好的路由文件放在src_managed/main ,因为生成的文件之一是 Java 文件,Java 编译器要求文件夹结构与包结构匹配,SBT 使用src_managed/main作为Java编译的根文件夹。 所以controllers.routes类必须在src_managed/main/controllers/routes.java ,其他任何东西和javac产生编译错误。

请注意,虽然在 master (Play 2.4) 中,我们现在在src_managed之外使用一个完全不同的目录,我想这会使这个问题消失。

请注意,这与 IntelliJ 13 和更新的 SBT 支持无关。 反向路由支持会自动获得。

@NIA的解决方法即使在 IntelliJ IDEA 14 中也有效。

这个问题非常令人困惑,我很惊讶它仍然没有解决。 是的,NIAs 的解决方法有效,但我花了很长时间才发现这个问题。 所以为了任何未来的 Play Java 开发者(他们使用 IntelliJ Idea 的可能性很高),我真的希望它会随着 Play 2.4 消失。

这在最新的 Intellij 14.1 中仍在进行; NIA 的解决方法还是可以的

我将@OlegYch的答案放在我的 Build.scala 中并重新加载项目。
我的 Intellij 仍然不包括“target/scala-2.11/src_managed/main”作为源文件夹。
这是我的 Build.scala:
screenshot from 2015-04-02 15 23 10

所以每次项目重新加载后我都必须手动添加源文件夹:(

FWIW,这些解决方案都不适用于 Play 2.3.8 和 IJ 14.1.x :(

我不确定这是否是相同的问题,但是在尝试执行return redirect(routes.Application.index()); , routes 不是可以使用的已知变量。

我正在尝试使用 IntelliJ 14.0.4 和最新版本的 Play (2.3.8?) 遵循基本播放框架示例(playframework.com 首页上的 YouTube 视频)。

然而我的应用程序编译并按预期运行!! 红色的波浪线很烦人; 伙计们请修复dis :)

cannot resolve symbol routes

+1 @PeterRangelov

我应该提供一个屏幕截图,我遇到了完全相同的问题。 一切都编译并运行良好,只是在 IntelliJ 中看起来很烦人。

仅供参考,这仍然是 play 2.4 的问题。 这些类编译得很好,但看起来很烦人,前面提到的创建假目录的解决方法不起作用。

screen shot 2015-06-20 at 8 29 31 pm

是的,我在使用 intellij idea 14 时遇到了同样的问题

我在 Intellij Idea 14.1.4 和 play framework 2.4.2 上遇到了同样的问题,但我在@ghost添加的链接的帮助下设法解决了这个问题,但它很旧,所以我不得不做一些小改动,这就是我所做的.
从 intellij 的项目导航器中右键单击“目标”目录,然后选择“将目录标记为”,然后选择“取消排除”。 之后,右键单击“scala-2.11/routes/main”文件夹并选择“将目录标记为源根目录”。 我还排除了“分辨率缓存”和“流”。

@hossamahamid我不能排除“./target”目录,但我可以排除“project->target”,不过,文件“scala-2.11/routes/main”在“./target”目录中。 当您提到“目标”时,您指的是位于项目根目录下的“目标”目录吗?
如果可以,请查看我的图片并告诉我这是否是您的情况(当我右键单击项目导航器中以蓝色突出显示的项目时显示的菜单):

screen shot 2015-07-15 at 11 06 28

screen shot 2015-07-15 at 11 06 36

screen shot 2015-07-15 at 11 07 46

可能是因为我在build.sbt中添加了一个相关的项目而无法进行预期的操作:

name := """WHTTP-front"""

version := "1.0-SNAPSHOT"

lazy val wcommon = RootProject(file("../WCommon"))

val root = (project in file(".")).enablePlugins(PlayScala).dependsOn(wcommon)

scalaVersion := "2.11.6"

//val whttp_front = Project(id = "root", base = file("."))

libraryDependencies ++= Seq(
  jdbc,
  cache,
  ws,
  specs2 % Test
)

libraryDependencies +=
  "com.typesafe.akka" %% "akka-remote" % "2.4-SNAPSHOT"

resolvers += "Akka Snapshot Repository" at "http://repo.akka.io/snapshots/"

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"

// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator


fork in run := true


我已经取消了项目根目录中target文件夹的排除。 现在它工作正常!

@vicaba是的,我的意思是根目录下的目标目录。 这很奇怪,但尝试从模块设置窗口中排除目标目录。 您可以通过右键单击项目目录并选择“打开模块设置”来打开它,或者从“文件”菜单中选择“项目结构”然后选择“模块”。

@hossamahamid我试过了,没有任何变化。 我也尝试了几种组合,但我无法让它工作。
但是当我在寻找解决方案时,我得出了两个发现:
第一个是,如果我将默认应用程序 _class_ 控制器更改为 _object_,则在键入路由时会得到正确的代码提示,但应用程序无法编译:S。 在早期版本的 Play 中,控制器所在的 _objects_ 。
我发现的另一个有趣的事情是,目前,我可以禁用 Play 路由检查:
screen shot 2015-07-15 at 14 26 04

通过单击右下角戴帽子的人来更改检查配置。

在进行操作系统全新安装后,我将在几天内再试一次。

总之谢谢大家的支持。

@vicaba我有同样的问题,我认为我们需要等待 Jetbras 来解决这个问题(在最终版本中),因为我不知道如果没有来自工具供应商的某种形式的“hack”,它是如何工作的。 由于控制器现在是语句路由的类。.method 总是无效的,因为在 Scala 中你不能调用一个类的方法。

@thobson是的,这正是我的想法......我们将不得不等待。

@vicaba我刚刚找到了一个 EAP 版本的插件,它似乎在大多数情况下都可以使用。 看看这里并下载插件的 1.5.2.3.EAP 版本。 您需要卸载现有的 Scala 插件,然后将此新版本复制到 plugins 目录中,并为其指定文件夹名称“Scala”。 当然它是 EAP 软件,所以它并不完美,但它对我来说似乎工作正常(到目前为止!)

@thobson谢谢,我会尽快尝试:)

Scala 插件 1.5.2.3.EAP 版本对我不起作用。 我改为禁用禁用播放路由操作检查。

这个问题在intellij 15-eap 和1.8 版的scala 插件中仍然存在。

我想知道为什么这个问题仍然关闭,即使它仍然是一个很大的问题。

javascript-red

它已关闭,因为这是 IntelliJ 导入项目的方式的问题,而不是 Play,因此该问题不属于 Play 的问题跟踪器。

此页面是否有帮助?
0 / 5 - 0 等级