【发布时间】:2020-04-30 04:29:27
【问题描述】:
我已将带有 the following method 的 Play/Scala 项目导入 Intellij,但由于我不明白的原因而出现编译错误。有什么想法吗?
我正在使用 Java 8 和 Scala 2.11.6。
def fetchUser(id: Long): Option[UserRecord] =
Cache.getAs[UserRecord](id.toString).map { user =>
Some(user)
} getOrElse {
DB.withConnection { connection =>
val sql = DSL.using(connection, SQLDialect.POSTGRES_9_4)
val user = Option(sql.selectFrom[UserRecord](USER).where(USER.ID.equal(id)).fetchOne())
user.foreach { u =>
Cache.set(u.getId.toString, u)
}
user
}
}
编译错误在于调用withConnection 方法。错误是:Cannot resolve overloaded method 'withConnection'。
当我尝试跳转到withConnection 方法的实现时,编译器在play.api.db.DB (2.4.3) 类中建议了两种可能的方法:
/**
* Execute a block of code, providing a JDBC connection. The connection is
* automatically released.
*
* @param name The datasource name.
* @param autocommit when `true`, sets this connection to auto-commit
* @param block Code block to execute.
*/
def withConnection[A](name: String = "default", autocommit: Boolean = true)(block: Connection => A)(implicit app: Application): A =
db.database(name).withConnection(autocommit)(block)
/**
* Execute a block of code, providing a JDBC connection. The connection and all created statements are
* automatically released.
*
* @param block Code block to execute.
*/
def withConnection[A](block: Connection => A)(implicit app: Application): A =
db.database("default").withConnection(block)
【问题讨论】:
-
你有没有修改源?如果没有,请考虑在 GitHub 存储库上将此问题报告为问题。我会首先检查一切是否兼容。您提到了 scala
2.11.6但sbt指定了2.11.7github.com/manuelbernhardt/reactive-web-applications/commit/… -
编译器抱怨,因为它无法确定调用哪个方法。你可以试试
DB.withConnection(name="default", autocommit="true") {...},以防它是默认参数搞砸了。也可能是它无法解析隐含的Application -
两个版本的Scala都没有解决这个问题。我改成2.11.6是因为其他章节的项目2.11.7有问题。当事情按预期工作时,当
withConnection在我发布的原始代码中,编译器会选择哪种方法,带有2个或3个参数列表的方法?我尝试按照您的建议添加带有两个参数的参数列表(我认为您可以简单地使用显式空列表代替),但我仍然遇到这个问题。 -
P.S.如果您查看 Github 存储库中 CH08 项目中的等效控制器/Application.scala 文件,则该代码中有一个非常相似的方法调用。当我将 CH08 项目导入 Intellij 时,IDE 不会在方法调用上显示编译错误。 (我必须在 CH08 降级 SBT 版本才能进行编译,所以我在 CH07 也做了同样的事情)。在 CH08 中,编译器可以毫无问题地选择其中一种方法(我认为在这种情况下它会选择只有 2 个参数列表的方法)。
-
这可能是 IDE 无法识别代码更改的奇怪情况(也称为错误)之一。我在 Intellij 和 Eclipse 中遇到过很多次这样的事件,不仅主要是在我导入新项目时,或者在我更改工作项目的某些依赖项的版本时。 Stackoverflow 充满了这样的问题和对某些人有效但对其他人无效的巫毒解决方案。我确实尝试过“使缓存无效并重新启动”,但没有任何变化。
标签: scala intellij-idea java-8 playframework compiler-errors