无法使用特征 NullPointerException 配置我的光滑设置



我重写了光滑的数据库层以使用特征(我以前使用类),现在出现此错误:

看起来我的数据库配置可能为空?

意外异常 预配

异常:无法预配,请参阅 以下错误:

注入构造函数 java.lang.NullPointerException at 时出错 play.api.DefaultApplication.class(Application.scala:221) 而 定位 play.api.默认应用程序,同时定位 play.api.Application Cause by : java.lang.NullPointerException at play.api.db.slick.HasDatabaseConfig$class.driver(DatabaseConfigProvider.scala:142)

下面是我的控制器,它使用 dbService,以及我用来使用 play-slick (2.02) 连接我的光滑代码的特征等

@Singleton
class HomeController @Inject() (dbService: DbService) extends Controller {
}

模块:

bind(classOf[DbService]).to(classOf[DbServiceImpl])

我的光滑数据库层设置如下:

trait DbService extends
UserTable
with AccountTable {
this: HasDatabaseConfigProvider[JdbcProfile] =>
import driver.api._
// ..
}
@Singleton
class DbServiceImpl @Inject() (protected val dbConfigProvider: DatabaseConfigProvider)
extends DbService with HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._

}

trait AccountTable {
this: HasDatabaseConfigProvider[JdbcProfile] =>
import driver.api._
lazy val accounts = TableQuery[AccountsTable]
def getAccountById(id: Int): Future[Option[Account]] =
db.run(accounts.filter(_.id === id).result.headOption)
class AccountsTable(tag: Tag) extends Table[Account](tag, "accounts") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def companyName = column[String]("company_name")
def * = (id, companyName) <> (Account.tupled, Account.unapply _)
}
}

我的光滑设置似乎有什么问题? 到目前为止,我无法弄清楚。

更新

完整的堆栈跟踪如下:https://pastebin.com/CXzUB0Kx

崩溃来自这里:https://github.com/playframework/play-slick/blob/2.0.2/src/core/src/main/scala/play/api/db/slick/DatabaseConfigProvider.scala#L142,所以你是对的,你的数据库配置(dbConfig)是null

这可能是初始化顺序问题。正如你在上面引用的代码中看到的,driver(作为一个lazy val)当然意味着在实例化后访问。

您是否发布了完整的堆栈跟踪?通向NullPointerException的完整堆栈跟踪将允许识别此访问的来源。

如果没有更精确的堆栈跟踪,则应确保不会过早访问通过import driver.api._导入的driver或成员。最有可能的原因是我们val你应该变成lazy val.

堆栈跟踪更新后

似乎你们中的一个懒惰字段在这里ApiService.scala:80被初始化,可能来自这里Schema.scala:544WebsiteTable的构造函数,从ApiService.scala:81调用。如果可能,请查看这些位置或在此处发布相关代码。

最新更新