无法使用特征 NullPointerException 来配置我的灵活设置
Unable to provision my slick setup using traits, NullPointerException
我重写了我的 slick 数据库层以使用 traits(我之前使用 类),现在我收到这个错误:
我的DatabaseConfig好像是null?
Unexpected exception ProvisionException: Unable to provision, see the
following errors:
Error injecting constructor, java.lang.NullPointerException at
play.api.DefaultApplication.class(Application.scala:221) while
locating play.api.DefaultApplication while locating
play.api.Application Caused by: java.lang.NullPointerException at
play.api.db.slick.HasDatabaseConfig$class.driver(DatabaseConfigProvider.scala:142)
下面是我使用 dbService 的控制器,以及我用来使用 play-slick (2.02)[=15= 连接我的 slick 代码的特征等]
@Singleton
class HomeController @Inject() (dbService: DbService) extends Controller {
}
模块:
bind(classOf[DbService]).to(classOf[DbServiceImpl])
我的 slick db 层设置如下:
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,所以你是对的,你的 DatabaseConfig (dbConfig
) 是 null
.
这可能是初始化顺序问题。正如您在上面引用的代码中看到的那样,driver
(作为 lazy val
)当然意味着要在实例化后访问。
你 post 有完整的堆栈跟踪吗?通向 NullPointerException
的完整堆栈跟踪将允许识别此访问的来源。
如果没有更精确的堆栈跟踪,您应该确保不会过早访问 driver
或通过 import driver.api._
导入的成员。最可能的原因是我们有些 val
你应该变成 lazy val
.
堆栈跟踪更新后
似乎你们中的一个惰性字段 ApiService.scala:80
被初始化了,可能来自 WebsiteTable
的构造函数 Schema.scala:544
,从 ApiService.scala:81
调用。如果可能,请查看这些位置或 post 此处的相关代码。
我重写了我的 slick 数据库层以使用 traits(我之前使用 类),现在我收到这个错误:
我的DatabaseConfig好像是null?
Unexpected exception ProvisionException: Unable to provision, see the following errors:
Error injecting constructor, java.lang.NullPointerException at play.api.DefaultApplication.class(Application.scala:221) while locating play.api.DefaultApplication while locating play.api.Application Caused by: java.lang.NullPointerException at play.api.db.slick.HasDatabaseConfig$class.driver(DatabaseConfigProvider.scala:142)
下面是我使用 dbService 的控制器,以及我用来使用 play-slick (2.02)[=15= 连接我的 slick 代码的特征等]
@Singleton
class HomeController @Inject() (dbService: DbService) extends Controller {
}
模块:
bind(classOf[DbService]).to(classOf[DbServiceImpl])
我的 slick db 层设置如下:
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,所以你是对的,你的 DatabaseConfig (dbConfig
) 是 null
.
这可能是初始化顺序问题。正如您在上面引用的代码中看到的那样,driver
(作为 lazy val
)当然意味着要在实例化后访问。
你 post 有完整的堆栈跟踪吗?通向 NullPointerException
的完整堆栈跟踪将允许识别此访问的来源。
如果没有更精确的堆栈跟踪,您应该确保不会过早访问 driver
或通过 import driver.api._
导入的成员。最可能的原因是我们有些 val
你应该变成 lazy val
.
堆栈跟踪更新后
似乎你们中的一个惰性字段 ApiService.scala:80
被初始化了,可能来自 WebsiteTable
的构造函数 Schema.scala:544
,从 ApiService.scala:81
调用。如果可能,请查看这些位置或 post 此处的相关代码。