Scala Play внедряет репозиторий в контроллер - PullRequest
0 голосов
/ 22 ноября 2018

мой репозиторий

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]
}

UsersTable

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]
}

Допустим, я ввожу этот репо здесь

class UserController @Inject()(repo: UsersRepository, cc: ControllerComponents, parsers: PlayBodyParsers)(implicit exec: ExecutionContext) extends AbstractController(cc) {

я получаю эту ошибку

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, поэтому любая помощь приветствуется. Кстати, я следовал за этой статьей , чтобы добраться до этого места.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Это то, что я получаю, если я пытаюсь ввести этот конфиг

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
0 голосов
/ 22 ноября 2018

, как указывает исключение: ..constructor annotated with @Inject or a zero-argument constructor that is not private. вы должны изменить конструктор хранилища на:

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]

...