Postgresql Scala Play将存储库注入控制器

Postgresql Scala Play将存储库注入控制器,postgresql,scala,playframework,slick,Postgresql,Scala,Playframework,Slick,我的存储库 import domain.{Db, User, UsersTable} import slick.basic.DatabaseConfig import slick.jdbc.JdbcProfile class UsersRepository(val config: DatabaseConfig[JdbcProfile]) extends Db with UsersTable { import config.profile.api._ def insert(us

我的存储库

import domain.{Db, User, UsersTable}
import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile


class UsersRepository(val config: DatabaseConfig[JdbcProfile])
  extends Db with UsersTable {

  import config.profile.api._

  def insert(user: User) = db.run(users += user)

}
域/用户

import play.api.libs.json.{ Json}

case class User (id:Long ,firstName: String, lastName:String)

object User {
  implicit val writeUser = Json.writes[User]
  implicit val readUser = Json.reads[User]
  implicit val formatUser = Json.format[User]
}
用户稳定

import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile
import services.UserTable

trait Db {
  val config: DatabaseConfig[JdbcProfile]
  val db: JdbcProfile#Backend#Database = config.db
}

trait UsersTable { this: Db =>
  import config.profile.api._
  private class Users(tag: Tag) extends Table[User](tag, "users") {
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

    def firstName = column[String]("first_name")

    def lastName = column[String]("last_name")
    // Select
    def * = (id, firstName, lastName) <> ((User.apply _).tupled, User.unapply)
  }
  val users = TableQuery[UserTable]
}
我得到这个错误

Could not find a suitable constructor in repository.UsersRepository. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
正如您所知,我不是scala程序员,因此非常感谢您的帮助
顺便说一句,我是按照这个方法到达这个地方的。

正如例外情况所示:
。用@Inject注释的构造函数或非私有的零参数构造函数。
您必须将存储库的构造函数更改为:

class UsersRepository @Inject()(val config: DatabaseConfig[JdbcProfile])
  extends Db with UsersTable {

  ...
}
如果仍然出现错误,则表示无法注入
DatabaseConfig
。然后您可以使用
UsersRepository
如:

class UsersRepository
  extends Db with UsersTable {

  val config: DatabaseConfig[JdbcProfile] = ??? //actual implementation
}

或者提供一个适合
DatabaseConfig[JdbcProfile]

的实现,如果我尝试注入该配置,这就是我得到的

CreationException: Unable to create injector, see the following errors:

1) No implementation for slick.basic.DatabaseConfig<slick.jdbc.JdbcProfile> was bound.
  while locating slick.basic.DatabaseConfig<slick.jdbc.JdbcProfile>
    for the 1st parameter of repository.UsersRepository.<init>(UsersRepository.scala:11)
  while locating repository.UsersRepository
    for the 1st parameter of services.UserService.<init>(UserService.scala:31)
  while locating services.UserService
    for the 1st parameter of controllers.UserController.<init>(UserController.scala:15)
  while locating controllers.UserController
    for the 3rd parameter of router.Routes.<init>(Routes.scala:29)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

1 error
CreationException:无法创建喷油器,请参阅以下错误:
1) 未绑定slick.basic.DatabaseConfig的实现。
查找slick.basic.DatabaseConfig时
用于repository.UsersRepository的第一个参数。(UsersRepository.scala:11)
查找repository.UsersRepository时
用于services.UserService的第一个参数。(UserService.scala:31)
查找services.UserService时
用于controllers.UserController的第一个参数。(UserController.scala:15)
查找controllers.UserController时
用于router.Routes的第三个参数。(Routes.scala:29)
at play.api.inject.RouteProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
绑定(类router.Routes to self)(通过模块:com.google.inject.util.modules$OverrideModule->play.api.inject.guice.GuiceableModuleConversions$$anon$1)
1错误

值得注意的是,UsersRepository也可以转换为
特征
,而config只是该特征中的一个值,尽管这意味着您必须使用
@ImplementedBy
将该特征绑定到另一个类。
CreationException: Unable to create injector, see the following errors:

1) No implementation for slick.basic.DatabaseConfig<slick.jdbc.JdbcProfile> was bound.
  while locating slick.basic.DatabaseConfig<slick.jdbc.JdbcProfile>
    for the 1st parameter of repository.UsersRepository.<init>(UsersRepository.scala:11)
  while locating repository.UsersRepository
    for the 1st parameter of services.UserService.<init>(UserService.scala:31)
  while locating services.UserService
    for the 1st parameter of controllers.UserController.<init>(UserController.scala:15)
  while locating controllers.UserController
    for the 3rd parameter of router.Routes.<init>(Routes.scala:29)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

1 error