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

时间:2017-03-20 03:09:12

标签: scala playframework slick

我重写了我的光滑数据库层以使用特征(之前我使用过类),现在我收到了这个错误:

看起来我的DatabaseConfig可能为空吗?

  

意外异常ProvisionException:无法配置,请参阅   以下错误:

     

注入构造函数时出错,java.lang.NullPointerException at   play.api.DefaultApplication.class(Application.scala:221)while   在定位时找到play.api.DefaultApplication   play.api.Application引起: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

1 个答案:

答案 0 :(得分:2)

崩溃来自: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)肯定是在实例化后访问的。

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

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

堆栈跟踪更新后

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